Spring源码阅读(七)
2024-09-05 15:17:39
这一讲主要分析bean注册过程中各种初始化方法回调的执行逻辑(initializeBean)
/**
* Initialize the given bean instance, applying factory callbacks
* as well as init methods and bean post processors.
* 生成bean实例,并且回调诸如init methods,bean post processors方法
* <p>Called from {@link #createBean} for traditionally defined beans,
* and from {@link #initializeBean} for existing bean instances.
* @param beanName the bean name in the factory (for debugging purposes)
* @param bean the new bean instance we may need to initialize
* @param mbd the bean definition that the bean was created with
* (can also be {@code null}, if given an existing bean instance)
* @return the initialized bean instance (potentially wrapped)
* @see BeanNameAware
* @see BeanClassLoaderAware
* @see BeanFactoryAware
* @see #applyBeanPostProcessorsBeforeInitialization
* @see #invokeInitMethods
* @see #applyBeanPostProcessorsAfterInitialization
*/
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
// 执行BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口方法
invokeAwareMethods(beanName, bean);
} Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// 执行BeanPostProcessor的postProcessBeforeInitialization方法,包括@PostConstruct注解方法
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
} try {
// 执行InitializingBean的afterPropertiesSet方法,包括init-method方法
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
// 执行BeanPostProcessor的postProcessAfterInitialization方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
} return wrappedBean;
}
最新文章
- Java多线程之CountDownLatch学习
- Linux 内核编译
- export a java project to runable jar
- Javascript学习笔记:6种实现继承的方式
- iOS NSNotification的使用
- NaN 和 Infinity
- tlplayer for wince 版本正式商用
- java10 WeakHashMap
- centos6.6 install
- bzoj 1303: [CQOI2009]中位数图
- 向map中追加元素
- return机制
- bs4解析要获取被注掉的部分需先将注释符号去掉
- hadoop集群的规划和搭建
- 如何用golang获取linux上文件的访问/创建/修改时间
- grpc(三)之grpc客户端使用连接池
- XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)
- HBase数据模型的一些概念
- JS正则表达式方法
- equals与==区别