引入
上一篇我们在声明一个被Spring容器管理的Bean时,在XML中
xml
<bean id="userDao" class="com.angelday.dao.UserDao">
- 我们使用注解开发时,只需要在想要声明Bean的类中添加一个注解
@Compnent()
并且在括号里添加这个Bean的id
java
@Component("id")
puiblic class UserDao{
public void save(){
System.out.println("userDao-->run!");
}
}
- 这样我们只能够声明这是一个被管理的bean,但是Spring容器并不能直接识别到它,所以我们需要创建一个类,来告诉Spring要去哪里找bean 我们在根目录下创建一个新的包:
config
,用来存放配置类
java
//这个注解用来声明这是一个Spring的配置类
@Configuration
//这个注解用来告诉Spring需要去哪里扫描bean
@ComponentScan("com.angelday")
public class SpringConfig{
}
- 测试,初始化容器与以前不一致
java
public class Test{
public static void main(){
//获取IoC容器,并且传入配置类
ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
//获取Bean,使用getBean("id");方法
UserDao userDao = (UserDao)ctx.getBean("userDao");
userDao.save();
}
}
与传统开发对比
注解只是代替了以前的内容
- 原先
xml配置文件
被SpringConfig类
代替 xml格式
写为类中的@Configuration
注解< bean>
标签被@Component
代替id属性
写在@Component("id")
中class属性
写到配置类的@ComponentScan("com.angelday")
- 获取IoC容器的对象
ClassPatjXmlApplicationContext
换为AnnotationConfigApplicationContext
注意:Spring提供了@Component注解的三个衍生注解
注解 | 说明 |
---|---|
@Controller | 表现层bean定义 |
@Service | 业务层bean定义 |
@Repository | 数据层bean定义 |
管理Bean
控制bean为非单例对象
在类前加上@Scope注解
java
@Component("userDao")
@Scope("prototype")
puiblic class UserDao{
public void save(){
System.out.println("userDao-->run!");
}
}
控制bean的声明周期
在类中添加方法,分别管理不同的声明时期,并且为这些方法添加注解
java
@Component("userDao")
puiblic class UserDao{
@PostConstruct
public void init(){}
@PreDestroy
public void destroy(){}
}
根据翻译不难看出,第一个在构造方法执行后,第二个在销毁前
依赖注入
自定义类型
只需要在需要装配的属性前加上@Autowired
并且可以省略
配置文件式开发使用的Setter方法
java
public class UserService{
@Autowired
private UserDao userDao
}
按类型自动装配:@Autowired
按名称自动装配:@Qualifier("bean's id")
注意:@Qualifier必须配合@Autowired注解使用
简单类型
在属性上直接使用@Value()注解
java
@Repository("userDao")
public class UserDao{
@Value("Zhangsan")
private String name;
}
注入外部Properties
priperties
name=zhangsan
在Spring配置类中添加@PropertySource()注解
java
@Configuration
@ComponentScan("com.angelday")
@PropertySource("classpath:Xxx.properties")
public class SpringConfig{
}
在需要注入的属性前添加@Value()注解
java
@Repository("userDao")
public class UserDao{
@Value(#{name})
private String name;
}
管理外部bean
方式
- 添加一个配置类用来获取要管理的对象
此处以添加Druid
的数据源为例
java
public class JdbcConfig{
//@Bean表示当前方法返回值是一个bean
@Bean
public DataSource dataSource(){
DruidDataSource dds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/db_name");
ds.setUsername("root");
ds.setPassword("123456");
return dds;
}
}
- 在SpringConfig配置类中导入这个配置类
使用@Import
java
@Configuration
@Improt(JdbcConfig.class)
public class SpringConfig{
}
优化
上面简单类型数据不应该写在类里,所以可以使用@Value的方式注入简单数据类型
java
public class JdbcConfig{
@Value("com.mysql.jdbc.Driver")
private String driver;
@Value("jdbc:mysql://localhost:3306/db_name")
private String url;
@Value("root")
private String userName;
@Value("123456")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource dds = new DruidDataSource();
ds.setDriverClassName(driver);
ds.setUrl(url);
ds.setUsername(userName);
ds.setPassword(password);
return dds;
}
}