@Autowired注解实现原理

什么是@Autowired注解?

        是spring的一个注释,可以对方法,构造函数,方法进行注释,让Spring做bean的自动装配

        含义:自动装配 JavaBean ,按照类型装配,通过set方法进行装配,set方法可以省略

       1 默认是按照类去装配,如果容器中没有与其匹配的类,则会报异常:

                NoSuchBeanDefinitionException

        2 按照类型装配,容器中如果有多个类型与之匹配,则会自动切换为名称装配,如果还未匹配则会报异常:

                NoUniqueBeanDefinitionException

@Autowired实现原理:

        首先找到@Autowired的具体实现类

AutowiredAnnotationBeanPostProcessor

         通过观察分析后发现,真正对bean有操作的方法貌似就只有三个,其中一个还被弃用了

 我们详细看一下第一个和第二个

1,查找所有@Autowired注入的方法和属性

public class AutowiredAnnotationBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware {
    
    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
        //查找所有被@Autowired注释的属性,并封装成InjectionMetadata
        InjectionMetadata metadata = this.findAutowiringMetadata(beanName, beanType, (PropertyValues)null);
        metadata.checkConfigMembers(beanDefinition);
    }
    
    
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
        //查找所有被@Autowired注释的方法或者属性,并封装成InjectionMetadata
        InjectionMetadata metadata = this.findAutowiringMetadata(beanName, bean.getClass(), pvs);
		//注入
        try {
            
            metadata.inject(bean, beanName, pvs);
            return pvs;
        } catch (BeanCreationException var6) {
            throw var6;
        } catch (Throwable var7) {
            throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", var7);
        }
    }
}

这里的两个方法的意思应该是,查所有被@Autowired的属性和方法,然后全部注入;

更深层的代码就不去看了,感兴趣可以自己深究一下,这几个核心的实现方法

findAutowiringMetadata(beanName, beanType, (PropertyValues)null);

buildAutowiringMetadata(clazz);

 

2,注入

metadata.inject(bean, beanName, pvs);
public void inject(Object target, @Nullable String beanName, @Nullable PropertyValues pvs) throws Throwable {
        //获取所有要被注入的方法,属性
        Collection<InjectionMetadata.InjectedElement> checkedElements = this.checkedElements;
        Collection<InjectionMetadata.InjectedElement> elementsToIterate = checkedElements != null ? checkedElements : this.injectedElements;
        if (!((Collection)elementsToIterate).isEmpty()) {
            Iterator var6 = ((Collection)elementsToIterate).iterator();

            while(var6.hasNext()) {
                InjectionMetadata.InjectedElement element = (InjectionMetadata.InjectedElement)var6.next();
                //注入
                element.inject(target, beanName, pvs);
            }
        }

    }
  protected void inject(Object target, @Nullable String requestingBeanName, @Nullable PropertyValues pvs) throws Throwable {
            if (this.isField) {
                Field field = (Field)this.member;
                ReflectionUtils.makeAccessible(field);
                field.set(target, this.getResourceToInject(target, requestingBeanName));
            } else {
                if (this.checkPropertySkipping(pvs)) {
                    return;
                }

                try {
                    Method method = (Method)this.member;
                    //反射调用注入方法,将获取到的所有bean作为参数
                    ReflectionUtils.makeAccessible(method);
                    //注入
                    method.invoke(target, this.getResourceToInject(target, requestingBeanName));
                } catch (InvocationTargetException var5) {
                    throw var5.getTargetException();
                }
            }

        }

       核心代码:

                    ReflectionUtils.makeAccessible(method);
                    method.invoke(target, this.getResourceToInject(target, 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值