@Autowired 注解
@Autowired 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set ,get方法。
@Autowired注解源码
从源码中看到它可以被标注在构造函数、属性、setter方法或配置方法上,用于实现依赖自动注入。
@Autowired注解的作用是由AutowiredAnnotationBeanPostProcessor实现的,看该类的源码会发现它实现了MergedBeanDefinitionPostProcessor接口,接口中的postProcessMergedBeanDefinition方法。
@Autowired注解正是通过这个方法实现注入类型的预解析。
将需要依赖注入的属性信息封装到InjectionMetadata类中,InjectionMetadata类中包含了哪些需要注入的元素及元素要注入到哪个目标类中。
@Autowired注解源码分析
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
//获取加了@Autowired的信息数据
InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
//将beanDefinition里Autowired相关信息添加到checkedElements里面,后面会用到。
metadata.checkConfigMembers(beanDefinition);
}
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
//获取加了@Autowired的信息数据
InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
//将beanDefinition里Autowired相关信息添加到checkedElements里面,后面会用到。
metadata.checkConfigMembers(beanDefinition);
}
我们可以看到上面这个方法到入参里有个beanDefinition,这个beanDefinition正是QualifierDemo的实例,然后通过findAutowiringMetadata方法会去找关于Autowired的信息。
这个方法执行完后,会执行AutowiredAnnotationBeanPostProcessor#postProcessProperties方法。
Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
//获取一些信息
InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
try {
//关键的方法
metadata.inject(bean, beanName, pvs);
}
catch (BeanCreationException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
}
return pvs;
}
inject方法:
public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
//取之前存入的checkedElements
Collection<InjectedElement> checkedElements = this.checkedElements;
//没有的话就取injectedElements,也是之前存入的
Collection<InjectedElement> elementsToIterate =
(checkedElements != null ? checkedElements : this.injectedElements);
if (!elementsToIterate.isEmpty()) {
//遍历@Autowired注解标记了的元信息数据集合,我们的示例中只有一个@Autowired User
for (InjectedElement element : elementsToIterate) {
if (logger.isTraceEnabled()) {
logger.trace("Processing injected element of bean '" + beanName + "': " + element);
}
//element正是我们示例代码里的User的一些描述
element.inject(target, beanName, pvs);
}
}
}
源码中分析要经过的两个方法postProcessMergedBeanDefinition和postProcessProperties,他们是因为实现了spring的接口,所以会被调用到
@Configuration
public class BeanPostConfig implements MergedBeanDefinitionPostProcessor, InstantiationAwareBeanPostProcessor {
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
System.out.println("postProcessMergedBeanDefinition:"+beanName);
}
@Override
public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
System.out.println("postProcessProperties:"+beanName);
return pvs;
}
}