SpringBean生命周期(~)
简述:
实例化(instantiateBean) —— 属性赋值(populateBean)—— 初始化(init) —— 销毁(destroy)
详细:
创建bean
- 通过xml
/注解@(Bean)。。等等方式注册bean
他们都是在spring的 **application中的refresh方法**中用loadBeanDefinitions进行加载
//SpringApplication下的
import org.springframework.boot.SpringApplication;
SpringApplication类中 refresh方法
protected void refresh(ConfigurableApplicationContext applicationContext) {
applicationContext.refresh();
}
底层调用的是 public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext {} 中的refresh方法
- 通过BeanDefinitionRegistry 通过BeanFactory和Registry进行后置处理
获得一个SpringBean的一个BeanDefinition对象
(有两个关键的属性:BeanName和BeanType) - 进行提前初始化调用getBean()方法
实例化(instantiateBean)
传入一个BeanName 通过 beanname去找到Bean对应的BeanType,通过反射 返回一个Object对象——也就是bean对象
BeanPostProcessors 代理 的注册功能,方便后期bean的一个拓展 (他是一个拓展点)
// Give BeanPostProcessors a chance to neturn a proxy instead of the target bean instance.
给BeanPostProcessors一个机会,将代理替换为目标bean实例。
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
// 拓展点,如何替换之前的bean?
-
通过BeanDefinitionRegistry
我们通过拿到BeanDefinitionRegistry对象,然后remove掉之前的bean的BeanDefinition对象,然后去注册我们自己的一个实现类的BeanDefinition
-
通过PostProcessors
通过PostProcessors判断是不是我们的beanname,然后return一个代理类
属性赋值 populateBean
- set
- construct
- @Resource autowireByName
- @AutoWire autowireByType
- 如果通过@AutoWire注入的时候有两个想同类型的bean,我们就要结合@Qualifier("BeanName")注入想要的bean
- 三级缓存解决循环依赖的问题
- 有aop的前提。
初始化(initializeBean)
调用三个aware方法
- BeanNameAware
- BeanFactoryAware
- ApplicationContextAware
BeanPostProcessor处理(拓展点)
而该接口下有两个方法
一个是前置处理postProcessBeforeInitialization
一个是后置处理postProcessAfterInitialization
里面的Init-Method (去实现相关接口)
其中 InitializingBeanj接口就是属于InitMethod
销毁(destroy)
与初始化相似
实现DisposableBean接口
调用destroy-method方法 (去实现相关接口)
注:
其中很多中间件框架的一些代码实现都是在实现InitializingBean和DisposableBean两个接口的时候进行
标签:初始化,生命周期,通过,接口,SpringBean,bean,refresh From: https://www.cnblogs.com/maomao777/p/16597303.html