没有合适的资源?快使用搜索试试~ 我知道了~
Bean的后置处理器MergedBeanDefinitionPostProcessor.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 98 浏览量
2022-07-04
22:33:18
上传
评论
收藏 27KB DOCX 举报
温馨提示
试读
14页
通过调试, 可以获取, 这里满足条件的, 有三个后置处理器, 按照调用先后顺序为: 1.CommonAnnotationBeanPostProcessor 2.AutowiredAnnotationBeanPostProcessor 3.ApplicationListenerDetector 接下来看看里面都干了啥 CommonAnnotationBeanPostProcessor 这一步, 主要是扫描作用. 1. 扫描 @PostConstruct 和 @PreDestroy (这个很直观的能看到, 其无参构造函数中, 出现了这两个注解) 2. 扫描 @Resource , 这个需要到 findResourceMetadata 中, 才能看到
资源推荐
资源详情
资源评论
Bean 后置处理器 -
MergedBeanDefinitionPostProcessor
创建完对象之后, 接下来, 就应该想办法对属性进行注入了, 其中就包括
@Autowired 注入
但是在注入之前, 貌似 还没有对 @Autowired 进行扫描和解析.
代码块:
if (instanceWrapper == null) {
/**
* 创建 bean 实例,并将实例包裹在 BeanWrapper 实现类对象中返回。
* createBeanInstance 中包含三种创建 bean 实例的方式:
* 1. 通过工厂方法创建 bean 实例
* 2. 通过构造方法自动注入(autowire by constructor)的方式创建 bean 实例
* 3. 通过无参构造方法方法创建 bean 实例
*
* 若 bean 的配置信息中配置了 lookup-method 和 replace-method,则会使用 CGLIB 增
强 bean 实例。
*/
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
final Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
//调用属性合并后置处理器, 进行属性合并
//这里会进行 一些注解 的扫描
//CommonAnnotationBeanPostProcessor -> @PostConstruct @PreDestroy @Res
ource
//AutowiredAnnotationBeanPostProcessor -> @Autowired @Value
**applyMergedBeanDefinitionPostProcessors** (mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName
,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
接着看里面的内容
protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Cl
ass<?> beanType, String beanName) {
for (BeanPostProcessor bp : **getBeanPostProcessors()** ) {
if (bp instanceof MergedBeanDefinitionPostProcessor) {
MergedBeanDefinitionPostProcessor bdp = (MergedBeanDefinitionPostProce
ssor) bp;
bdp. **postProcessMergedBeanDefinition** (mbd, beanType, beanName);
}
}
}
通过调试, 可以获取, 这里满足条件的, 有三个后置处理器, 按照调用先后顺序为:
1.CommonAnnotationBeanPostProcessor
2.AutowiredAnnotationBeanPostProcessor
3.ApplicationListenerDetector
接下来看看里面都干了啥
CommonAnnotationBeanPostProcessor
这一步, 主要是扫描作用.
1. 扫描 @PostConstruct 和 @PreDestroy (这个很直观的能看到, 其无参构造
函数中, 出现了这两个注解)
2. 扫描 @Resource , 这个需要到 findResourceMetadata 中, 才能看到
public CommonAnnotationBeanPostProcessor() {
setOrder(Ordered.LOWEST_PRECEDENCE - 3);
setInitAnnotationType( **PostConstruct**.class);
setDestroyAnnotationType( **PreDestroy**.class);
ignoreResourceType("javax.xml.ws.WebServiceContext");
}
/**
* 1.遍历扫描方法上标注了 @PostConstruct 和 @PreDestroy 注解的类
* 2.遍历扫描方法上标注了 @Resource 注解的类
* @param beanDefinition
* @param beanType
* @param beanName
*/
@Override
剩余13页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 210
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功