一、引入
@Autowired属于方法级别注解,可修饰构造器方法、Setter方法、普通方法,替换了autowire属性自动装配(按照类型装配,通过set方法,且方法可以省略)
语法:@Autowired(required="true")
属性参数:required==>是否为必须注入项
作用:自动注入一个符合类型要求的bean
注意:
1.如果容器中没有一个可以与之匹配且required属性为true则会报NoSuchBeanDefinitionException异常
2.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称byName装配
3.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称byName装配,如果名称也没有匹配,则报NoUniqueBeanDefinitionException异常
二、实现原理
@Autowired位于org.springframework.beans.factory.annotation包。
@Autowired注解的实现过程就是调用了AutowiredAnnotationBeanPostProcessor类中的方法。
核心方法postProcessProperties():
1.获取当前类中标注了@Autowired的成员变量和方法的参数封装在metadata对象里
2.利用反射赋值
调用findAutowiringMetadata方法查询,返回InjectionMetadata对象
执行inject方法完成属性注入
内部inject方法
getResourceToInject方法的参数就是要注入的bean的名字,这个方法的功能就是根据这个bean的名字去拿到它。
三、小总结
@Autowired和@Resource的区别是什么?
- @Autowired是Spring提供的注解,@Resource是JDK提供的注解。
- @Autowired默认的注入方式为byType(按类型自动注入),@Resource默认注入方式为byName(按名称自动注入)。