@Autowired注解我们实际工作和学习中,用的是比较频繁的。此注解使用非常方便,您了解过它的实现原理吗?本文带您全面了解下@Autowired注解。
1、可以对Bean类成员变量、方法及构造函数进行标注,完成依赖注入的自动装配工作。使用@Autowired可以省略Bean类的待依赖注入对象的set方法,@Autowired默认情况下按照依赖注入对象的类型自动进行匹配。加入@Autowired注解的方式是在Bean类依赖注入对象的前面加上@Autowired语句。
2、@Autowired还提供required的属性,用来处理当注入的Bean实例不存在的情况。required为true时,如果注入的Bean实例不存在,程序会抛出异常;required为false时,如果注入的Bean实例不存在,程序会忽略。由于默认情况下@Autowired是按类型匹配的(byType),如果需要按名称(byName)匹配,可以使用@Qualifier注解与@Autowired结合。
下面结合源码了解它的实际工作过程即是怎么把我们需要的类注入到我们类中的。@Autowired注入过程,实际上分为三个方面:1、元信息解析;2、依赖查找;3、依赖注入(字段、方法)。
元信息解析,在处理过程中,有一个类叫DependencyDescriptor,比如说我们的依赖描述器或者依赖描述符,那个里面就记录了我们注入的对象是关于那个字段,比如说我的字段名称以及它的字段相关的元信息,就是我们说java发射一个field字段,这个部分了解完之后它就会把相关的信息包括类所有的信息全部加入进来,帮助我们去分析,包括它的一个字段类型或者方法里面参数类型等等,
依赖查找,依赖查找其实就是依赖处理
依赖注入,@autowired可以注入在字段和方法里面,
这个就是@Autowired的一个操作思路:解析谁要进行注入==》查找依赖的来源==》注入的一个对象。
现在还是上源码,注意看注释部分
一、@Autowired的源码,通过源码可以看到他可以应用在方法、字段、注解等
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
二、注解的实现类:AutowiredAnnotationBeanPostProcessor,通过它的构造方法,可以看到它不仅支持@Autowired还支持@Value注解。
public class AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter
implements MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware {
//省略部分代码
/**
* Create a new {@code AutowiredAnnotationBeanPostProcessor} for Spring's
* standard {@link Autowired @Autowired} and {@link Value @Value} annotations.
* <p>Also supports JSR-330's {@link javax.inject.Inject @Inject} annotation,
* if available.
*/
@SuppressWarnings("unchecked")
public AutowiredAnnotationBeanPostProcessor() {
this.autowiredAnnotationTypes.add(Autowired.class);
this.autowiredAnnotationTypes.add(Value.class);
try {
this.autowiredAnnotationTypes.add((Class<? extends Annotation>)
ClassUtils.forName("javax.inject.Inject", AutowiredAnnotationBeanPostProcessor.class.getClassLoader()));
logger.trace("JSR-330 'javax.inject.Inject' annotation found and supported for autowiring");
}
catch (ClassNotFoundException ex) {
// JSR-330 API not available - simply skip.
}
}
}
三、还是AutowiredAnnotationBeanPostProcessor,它实现了接口类MergedBeanDefinitionPostProcessor的方法postProcessMe