spring依赖注入底层详解
2022-11-25 17:52:31 0 举报
spring依赖注入底层详解
作者其他创作
大纲/内容
获取注解的require属性
field上是否存在是否存在@Autowired、@Value、@Inject中的其中一个
如果一个Bean的类型是String...,那么则根本不需要进行依赖注入
determineRequiredStatus(ann);
优先级
如果descriptor所对应的类型是数组、Map这些,就将descriptor对应的类型所匹配的所有bean方法
@Priority
遍历class中的所有Field
Method bridgedMethod = BridgeMethodResolver.findBridgedMethod(method);
根据beanName筛选
方法
Modifier.isStatic(method.getModifiers())
直接注入这个bean
是属性还是方法
spring 5.3.10
1,只有一个
targetClass = targetClass.getSuperclass();
是否有多个bean对象
@Primary
多个bean对象
@Bean( autowireCandidate = false)public User User(){return new User();}如这样则User不能当做注入对象
如果没有Qualifier,或者Qualifier之后还有多个
判断是不是isAutowireCandidate
获取当前类的父类,继续循环获取需要依赖注入的属性和方法
如果是属性注入,那就是属性的名称;如果是set方法,那就是方法名称除去set再是beanName的获取方式一样。(开始字母两个大写就一样,一个首字母大写就小写首字母,其余不变)
寻找注入点
解析注入点并缓存
@Qualifier
BeanPostProcessor.postProcessProperties()
判断method上是否存在@Autowird@Value@Inject
判断方法是否是static
判断是否有Qualifier注解
加入到currElements缓存对象中
Modifier.isStatic(field.getModifiers())
依赖属性解析
beanName
反射,设置属性或者方法的值
遍历完当前类的字段和方法,生成PropertyDescriptor对象
循环父类的@Autowird@Value@Inject属性和方法
将field信息构建成AutowiredFieldElement对象,作为一个注入点对象添加到currElements集合中
判断是不是桥接方法
先循环的当前类,后循环的当前类的父类,所以是将父类的依赖注入属性和方法放在子类的之前
为什么不支持static field?当bean的scope属性为原型(prototype)时,连续获取两次一样的bean实例,例如:UserService userService1 = context.getBean(\"userService\")UserService userService2 = context.getBean(\"userService\")userService1的orderService值就是userService2中属性注入的值
找到候选的bean对象
判断需要依赖注入的bean是否是以java.开头的
注入设置值
当一个类实现了带有泛型的接口时,带有Autowird注解的方法,在字节码中会有 public synthetic bridge 开头的方法,这个方法就是桥接方法,spring是需要去找到真正的方法,桥接方法是合成的
spring利用MergedBeanDefinitionPostProcessor扩展点进行@Autowired、@Value、@Inject 依赖注入
0,未找到
findAutowiredAnnotation(field);
遍历class中的方法Method
@Bean@Qualifier(\"user\")public User User(){return new User();}限定名称为user的bean对象
require属性为为ture,则报错
判断字段是否是static
构造AutowiredMethodElement对象
AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition()
findAutowiredAnnotation(bridgedMethod);
属性
根据beanName以及类型等找对应的bean实例
0 条评论
回复 删除
下一页