bean的生命周期核心步骤总结
source link: https://blog.51cto.com/u_15696939/5434478
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
BFPP与BPP说明
后续行文为了方便,用BFPP代指BeanFactoryPostProcessor,用BPP代指BeanPostProcessor。
xml/注解方式开启spring
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml");
// 注解方式
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext("com.hulang.bean");
refresh() 中的obtainFreshBeanFactory()
创建的是DefaultListableBeanFactory
设置容器属性值
customizeBeanFactory(beanFactory);
加载bean定义信息
包含非常多的重名重载方法,建议debug调试查看,不然容易晕。
xlm转换成document
document解析成element
parseDefaultElement(ele, delegate)
默认的指bean
delegate.parseCustomElement(ele)
自定义的指以context、aop等开头或者自定义的标签。
以上两种标签解析后的结果都封装在BeanDefinition中,获取的是GenericBeanDefinition,后续实例化用的是RootBeanDefinition,需要进行一个合并。
给容器工厂设置属性值
prepareBeanFactory(beanFactory);
设置类加载器等
postProcessBeanFactory
空方法,供子类实现。
实例化和执行BFPP
调用和执行BFPP,操作的对象是BeanFactory,可以创建、修改或者引入其他的BeanDefinition,里面有个非常重要的类,ConfigurationClassPostProcessor
ConfigurationClassPostProcessor
完成@Bean,@Component.@ComponentScan,@Import,@ImportSource等注解的解析
完成BPP的实例化与注册
registerBeanPostProcessors(beanFactory),完成BPP的注册与实例化,方便后续在创建bean过程完成之后调用before/after方法堆bean进行增强。
完成自定义对象的创建
finishBeanFactoryInitialization(beanFactory)
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
将需要创建的对象放到list中,逐一进行创建。
getMergedLocalBeanDefinition会将上文提到的GenericBeanDefinition转换成RootBeanDefinition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof SmartFactoryBean<?> smartFactoryBean && smartFactoryBean.isEagerInit()) {
getBean(beanName);
}
}
else {
getBean(beanName);
}
}
}
getBean
doGetBean
先从容器中找,如果没有再创建
createBean
doCreataBean
createBeanInstance
创建bean有多重方式
getInstanceSupplier(Supplier方式创建)
instantiateUsingFactoryMethod(FactoryMethod方式创建)
instantiateBean(默认的,反射方式创建)
instantiateBean
其实还有个BPP代理模式创建对象,但不是在createBeanInstance,而是在前面的步骤
最终调用反射进行bean的创建
注册生命周期接口
也就是applyMergedBeanDefinitionPostProcessors
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
} catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
再此步骤完成@PostConstruct、@PreDestory、@Resource、@Autowire、@Value注解的解析工作。
填充属性populateBean
创建依赖的对象,循环依赖问题再此触发
进行初始化initializeBean
执行invokeAwareMethods
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
执行BPP的before方法
ApplicationAwarePostProcessors、CommonAnnotationBeanPostProcessor等
invokeInitMethods
如果实现了InitializingBean接口,需要调用afterPropertiesSet,最后一次修改属性值
执行用户自定义的init-method(invokeCustomInitMethod)
执行BPP的after方法
aop功能再此实现。
destroyBeans()
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK