@Resource注解底层原理
2022-11-28 17:40:33 0 举报
@Resource注解底层原理
作者其他创作
大纲/内容
不是
Modifier.isStatic(field.getModifiers())
spring 5.3.10
注入属性值
循环遍历属性和方法上有@Resource的注解
若没有找到对应beanName的bean实例,报错
跟@Autowird注解一致,先byType再byName
CommonAnnotationBeanPostProcessor.java
获取被注入的bean实例
直接根据指定的beanName去找bean实例
寻找@Resource注解的方法或者属性
否,构建ResourceElement对象放入currElements中
简单版:https://www.processon.com/view/link/5f91275f07912906db381f6e
未指定name,则会跟@Autowird一致,先byType再byName
假设@Resource中没有指定name,并且field的name或setXxx()的xxx不存在对应的bean,那么则根据field类型或方法参数类型从BeanFactory去找
循环父类的方法和属性
buildResourceMetadata(clazz);
是则构建ResourceElement对象并放入currElements中
targetClass.getSuperclass();
否则判断方法的参数是不是只有一个
进行注入
是static则报错
if (this.fallbackToDefaultTypeMatch && element.isDefaultName && !factory.containsBean(name))
BeanFactory寻找bean,其实就是去singletonObjects(单例池Map)和beanDefinition(bean定义Set)缓存中去找
throw new IllegalStateException(\"@Resource annotation is not supported on static fields\");
@Resource annotation requires a single-arg
属性field
Spring利用BeanPostProcessor的扩展点来实现@Resource注解的功能,在bean的属性注入中调用postProcessProperties方法进行属性注入
BeanFactory找到适合的bean对象
属性还是方法
方法method
调用InjectionMetadata.java的inject方法
是
寻找@Resource注入点
@Resource是否指定name &&BeanFactory中不包含name的bean实例
是,那么报错
调用CommonAnnotationBeanPostProcessor.java的getResourceToInject方法
遍历每个元素进行注入
非lazy加载
属性是否static的
放入到切面元素集合的第一个元素中
构建@Resource元数据
否
则只会根据属性的name或者方法的名字(除去setXxx)去getBean()
paramTypes.length != 1
0 条评论
回复 删除
下一页