@Autowired注解如何实现自动装填?

@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;
    }
}
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值