SpringBean的生命周期
- 实例化 (构造方法)
- 属性赋值 (setter)
- 初始化
- 销毁
如下三个方法与上面的3个生命周期一一对应
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
// 实例化阶段!
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 属性赋值阶段!
populateBean(beanName, mbd, instanceWrapper);
// 初始化阶段!
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
根据上面主要的四个生命周期,还有些围绕四个生命周期扩展的Bean方法
第一大类接口:
- BeanPostProcessor
- InstantiationAwareBeanPostProcessor
上述两个是Spring扩展中较为重要的两个类
第二大类接口:
- Aware类型的接口 (获取spring中的资源,都是在初始化之前调用的)
- BeanNameAware (获取bean的名称)
- BeanClassLoaderAware (获取bean的加载器)
- BeanFactoryAware (获取bean的工厂)
- EnvironmentAware (获取上下文环境)
- EmbeddedValueResolverAware (如果需要让自己自定义的注解支持spel表达式的时候可以使用,就需要这个)
- ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware) (为了返回ApplicationContext对象)
- 生命周期接口
- InitializingBean (对应生命周期初始化阶段)
- DisposableBean (生命周期的销毁阶段)
最后可以谈一下面试常见的ApplicationContext和BeanFactory的区别
ApplicationContext
:对于Bean的加载属于是延迟加载,从容器中用到的时候才回去实例化
Spring底层的接口,提供了最简单的实例化对象和获取对象的功能
BeanFactory
:在启动的时候就将所有的Bean都实例化了.它还可以为Bean配置lazy-init=true来让Bean延迟实例化;
- 国际化(MessageSource)
- 访问资源,如URL和文件(ResourceLoader)
- 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web
- 消息发送、响应机制(ApplicationEventPublisher)
- AOP(拦截器)
如果喜欢博主,可以关注我的公众号哈