依赖注入流程图
2023-01-18 23:07:50 0 举报
spring 依赖注入
作者其他创作
大纲/内容
不符合
直接返回
@Resource
遍历所有注入点InjectionMetadata.inject
带
还是没有根据beanName找出唯一的那个bean
isAutowireCandidate
是
条件2
上面没有报错,判断返回的map
QualifierAnnotationAutowireCandidateResolver.isAutowireCandidate,检查bd(前面遍历的beanname生成的bd)的qualifier属性和当前注入点的qualifier属性是否匹配
判断注入点的类型是否在resolvableDependencies集合中(该集合中的内容会在容器启动的时候进行初始化),若存在,把集合中的bean加入到结果中去
若有直接调用factorybean的getObjectType获取类型,然后进行匹配,若当前注入点的类型与factorybean类型匹配
true
符合条件
此方法具体实现
bd是否为factroybean
@Autowired、@Value、@Inject
BeanFactoryUtils.beanNamesForTypeIncludingAncestors根据注入点的type找到所有匹配的beanName
autowireResource
Map
条件1
返回map结果集
符合
若当前依赖描述器类型为String,获取environment中的对应值,且解析spring表达式
GenericTypeAwareAutowireCandidateResolverfont color=\"#323232\
处理lazy和上面一致
determineAutowireCandidate
checkPropertySkipping(pvs)判断bd中的propertyValues中是否包含了当前beanName
包含
根据类型进行找bean(beanFactory.resolveDependency)
@Resource 如果没有设置name的情况下是先byname再bytype 如果设置了name,直接byname
获取依赖描述器的类型并获取@value注解的值
找到唯一的那个bean
加入结果集,加入结果集的有可能是bean对象(单例池中有就算bean对象),有可能是class(单例池中没有进行类加载返回class)
Collection
有,处理@value注解
字段注入(AutowiredFieldElement<内部类>.inject)、方法参数注入(AutowiredMethodElement<内部类>.inject)
看单例池是否有bean,有直接匹配typeToMatch.isInstance(beanInstance),没有根据bd中的beanClass进行匹配,没有beanClass先进行类加载
CommonAnnotationBeanPostProcessor.ResourceElement.getResourceToInject
属性
不包含
从多个bean中选择被primary注解标记的bean,多个报错
AutowiredAnnotationBeanPostProcessor.postProcessProperties
DefaultListableBeanFactory.doGetBeanNamesForType
没有一个符合条件,且现在结果集为空
调用AutowiredAnnotationBeanPostProcessor.resolveMethodArguments获取需要注入的bean数组,以数组的形式通过方式给方法中的参数进行注入值,该方法中最终还是调用的resolveDependency(方法参数有几个就调用几次)
都不是
若为空,且autowired的required的属性为true(默认为true)则报错
跳过注入(注意虽然跳过@autowired这种形式的注入了,但会在AbstractAutowireCapableBeanFactory.AbstractAutowireCapableBeanFactory.applyPropertyValues 1434行拿到设置好的propertyValue进行注值)
取出map中的value封装成集合进行返回
得到合并后的bd
DefaultListableBeanFactory.doResolveDependency
先看单例池中是否有bean
是否有值
若对应的instanceCandidate类型(也就是找出来的bean)为Class,进行getBean操作,不是class类型直接返回对应bean
如果没有,看bean上的priority注解的值,越小优先级越高,取优先级最高的bean
判断依赖描述器类型
CommonAnnotationBeanPostProcessor.postProcessProperties
DefaultListableBeanFactory.getBeanNamesForType
若没有,先生成factorybean对象,再调用getObjecttype进行匹配
匹配
若为默认名字(也就算Resource注解中没有设置name属性)且 根据名字在bean工厂找不到对应的bean
直接根据name(可能是默认值,可能是自己设置的值)进行getBean
找出自己注入的直接的Object(可能是bean对象可能是Class)且符合isAutowireCandidate的过滤条件加入到结果集中
类型转换器进行类型转换
遍历容器中的所有bdname
非lazy,调用getResource
不带
一个
逻辑
结束
方法
注入点上带lazy注解
0 条评论
回复 删除
下一页