1

bean的生命周期核心步骤总结

 1 year ago
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

// xml方式
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-test.xml");
// 注解方式
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext("com.hulang.bean");

refresh() 中的obtainFreshBeanFactory()

创建的是DefaultListableBeanFactory

DefaultListableBeanFactory beanFactory = createBeanFactory();

设置容器属性值

beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);

加载bean定义信息

loadBeanDefinitions(beanFactory);

包含非常多的重名重载方法,建议debug调试查看,不然容易晕。

xlm转换成document

document解析成element
parseDefaultElement(ele, delegate)

默认的指bean

delegate.parseCustomElement(ele)

自定义的指以context、aop等开头或者自定义的标签。

以上两种标签解析后的结果都封装在BeanDefinition中,获取的是GenericBeanDefinition,后续实例化用的是RootBeanDefinition,需要进行一个合并。

给容器工厂设置属性值

prepareBeanFactory(beanFactory);

设置类加载器等

postProcessBeanFactory

空方法,供子类实现。

实例化和执行BFPP

invokeBeanFactoryPostProcessors(beanFactory)

调用和执行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

for (String beanName : beanNames) {
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

// Allow post-processors to modify the merged bean definition.
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
private void invokeAwareMethods(String beanName, Object bean) {
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功能再此实现。

bean的生命周期核心步骤总结_实例化

destroyBeans()


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK