自动装配:Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖赋值
1、@Autowired:
默认先按照类型去容器中找相应的组件(applicationContext.getBean(Xxx.class)),若只找到一个则进行装配,若找到多个则再按照属性的名称作为id找对应的组件(applicationContext.getBean("beanId"));另外可使用@Qualifier指定属性Bean的id进行装配,如果没有找到指定的属性bean,则会报NoSuchBeanDefinitionException的异常,如果想在找不到属性bean的时候不让程序出错,则可以设置@Autowired的required属性为false:@Autowired(required=false),此时则在容器中有该属性bean时装配,无则不装配
@Service
public class BookService {
@Autowired
@Qualifier("bookDao")
private BookDao bookDao;
}
看下面代码:
@Configuration
@ComponentScan({"com.bdm.service","com.bdm.dao"})
public class MyAutowireConfig {
@Bean
public BookDao bookDao2(){
return new BookDao();
}
}
此时该配置类容器中会有两个BookDao实例,一个是通过自动扫描创建的,一个是通过@Bean注解创建的,通过自动扫描创建的bean的id默认为类名的首字母小写,通过@Bean注解创建的id则为方法名
使用Spring提供的@Primary注解指定首选装配的Bean:在容器中有多个该类型的bean时,优先装配该bean
@Configuration
@ComponentScan({"com.bdm.service","com.bdm.dao"})
public class MyAutowireConfig {
@Bean
@Primary
public BookDao bookDao2(){
return new BookDao();
}
}
此时在容器中有多个BookDao类型的bean时会优先装配这个由@Primary注解的bean,除非使用@Qualifier明确制定了要装配的bean的id
2、@Resource(JSR250规范)和@Inject(JSR330规范):这两个是Java规范的注解,而@Autowired是Spring自己的注解
@Resource默认是按照组件的名称(属性名作为id)装配,而不像@Autowired是默认先按照类型装配,使用@Resource时@Primary注解会失效,也可以使用@Resource注解的name属性指定组件,类似于@Autowired结合@Qualifier,但是@Resource不支持required=false,也就是说使用@Resource时必须装配成功,否则会报错:NoSuchBeanDefinitionException
@Service
public class BookService {
//@Autowired(required=false)
//@Qualifier("bookDao3")
@Resource(name="bookDao2")
private BookDao bookDao;
}
使用@Inject时需要导入依赖:javax.inject
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
@Inject的功能和@Autowired的功能一样,也支持@Primary注解,只是少了required=false的属性
@Service
public class BookService {
//@Autowired(required=false)
//@Qualifier("bookDao3")
//@Resource(name="bookDao2")
@Inject
private BookDao bookDao;
}
这三个注解的区别在于:@Autowired是Spring的注解,脱离不了Spring的支持,@Resource和@Inject是java的规范,其他的框架也会支持,但是@Autowired的功能稍微强大一些
这些注解之所以能完成自动装配的功能,是因为Spring提供的后置处理器AutowiredAnnotationBeanPostProcessor,该后置处理器通过解析@Autowired、@Resource、@Inject等注解完成自动装配