目录
2.JSR250规范中的@Resource和JSR330规范中的@Inject --java规范
自动转配
1.@Autowired自动注入 -- spring规范
当在一个组件需要使用另外一个组件时,在要用的组件上加上这个注解。
规则:默认通过类型去IOC容器获取;如果找到了多个,将属性名称作为组件的id去容器中查找。
1.1 如下所示,默认根据UserDAO去容器中(假如容器中注册有userDAO和userDAO2两个)获取,如果找到多个就根据组件名userDAO2去找。
@Service
public class UserService {
@Autowired //这个注解有一个属性required 表示是否必须,默认是true,IOC容器中必须要有bean才行,否则抛异常,如果为false则不强制IOC容器中一个要有这个bean
private UserDAO userDAO2;
}
1.2 如果现在这里我们需要自己决定通过组件名获取,使用@Qualifier
@Service
public class UserService {
@Qualifier("userDAO") //这里自己指定通过userDAO去容器中获取bean
@Autowired
private UserDAO userDAO2;
}
1.3 @Primary ,让Spring进行自动转配的时候,默认使用首选的bean,此时,也可以使用@qualifier的值
配置类:
@Configuration
public class MainConfigAutowired {
@Primary
@Bean("userDAO2")
UserDAO userDAO(){
return new UserDAO();
}
}
组件:
@Service
public class UserService {
//@Qualifier("userDAO") //不使用这个,默认就会通过Primary的方式去注入
@Autowired
private UserDAO userDAO;
}
2.JSR250规范中的@Resource和JSR330规范中的@Inject --java规范
@Resource和@Autowired一样都是可以实现自动转配,默认按照组件名称来装配的;不支持@Primary功能,以及required 属性的功能
@Inject这个使用,需要导入依赖包javax.inject,和@Autowired功能相同,没有required=false功能
3.@Autowired装配可以用在构造器和方法上
3.1 装配在构造器
如果构造器只有一个有参构造器(没有其他无参或者其他构造器),这个有参构造器的@Autowired可以省略
@Service
public class UserService {
private UserDAO userDAO;
@Autowired
UserService(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
3.2 装配在方法上
@Service
public class UserService {
private UserDAO userDAO;
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
}
@Bean的方法参数也是自动从容器中获取,不同手动使用@Autowired.
@Bean
public User user(@Autowired Task task){ //这里的@Autowired可以省略,也是自动装配的
return new User();
}