依赖注入底层原理

依赖注入底层原理
    通过反射设置的
1 spring中到底有几种依赖注入的方式
    spring自带的sping依赖注入的代码是xml方式的自动注入,依赖属性是byType,byName,constructor,default,no。autowired自动注入的是继承BeanPostProcessor接口来实现的
    手动注入所依赖的bean的时候,扫描bean标签生成BeanDefinition时,依赖的bean存在Properties中,类似于map ,key:name,value:bean

    1)、手动注入
        set 方法:xml 中再bean中使用property 引入。底层依赖的是bean的set方法
        构造方法:使用index标识第几个参数
    2)、自动注入
        1、xml中的自动注入  : 方法的参数必须只有一个参数
            spring xml自动注入默认是关闭的
            (1)xml中有autowire="byType" : 会找类中多有的set方法,根据方法中的参数类型,找bean。并不关心是否有成员属性。
                找到类型转化器
                找到所有set方法所对应的名字,找到propertyDescriptor(属性描述),
                根据属性描述,找到方法参数,生成依赖描述,DependencyDescriptor
                resolveDepency方法解析依赖描述,得到bean
            (2)xml中有autowire="byName" : 会找类中所有的set方法,根据set方法去掉set做为名字,并不是用的参数的名字或者成员属性的名字。如果有需要设置的,就根据name去查找bean,找到后把bean放到pvs中。
            (3)xml中有autowire="constructor" : 
            (4)xml中有autowire="default" : 根据beans里面搜配置的属性来  default-autowire="byTypte"
            (5)xml中有autowire="no" :
        2、@Autowired 注解的自动注入
            @Bean注解替代的是bean标签
            @Autowired注解替代 xml。可用于属性,set方法,构造方法上。
            使用ClassXMLApp时,需要再xml中开启自动注解
            使用AnnotationApplicationCont
            怎么工作:
                不仅替代了,还升级了。可以使用到属性上,把byType和byName结合了,先byType,再byName(先byName,找到的类型可能不对)
                不一定非得是set方法,非set方法也能匹配到。
2 AutowiredAnnotationBeanPostProcessor


DependencyDescriptor :依赖描述,可以是属性的依赖描述,也可以是方法的
DependencyDescriptor.getType ---> beanFactory ---> 多个bean  ---> DependencyDescriptor.getDependencyName()


@Autowired  工作流程,第一步是扫描注入点,第二步,注入

InjectionMetadata.injectedElements   存储的是某个类的所有注入点
InjectedElement 中有个属性isField,标识是否是属性注入,值为false的时候表示是方法注入

注入点:属性注入点,方法注入点
1)扫描注入点: 是在MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition()中完成的
    先找本身类的注入点:
        先找属性注入点 : 如果有@Autowired,@Value,@Inject 三个注解中的一个就注解
        再找方法的注入点
    再找父类的注入点
        树性注入点
        方法注入点
2)注入 : 是在属性填充后的InstantiationAwareBeanPostProcessor.postProcessProperties()中完成的。
    字段:根据feild生成一个DependencyDescriptor,然后调用resolveDenpency。
    方法:把每一个参数都生成一个DependencyDescriptor,然后调用resolveDenpency。


静态方法或者方法的参数个数是0,就不能进行注入
xml byType set方法的参数只能是一个 autowired 放到方法上的时候,参数可以是多个,
autowired  发现多个bean时,依赖注入是可以使用Qualifier注解指定名称指定依赖哪个bean


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值