Spring原理之Bean生命周期
Spring Bean的生命周期是指Bean从创建到销毁的整个过程,大致分为4个阶段:
[*]Bean的实例化阶段:Spring容器根据BeanDefinition信息,通过反射创建对象;
[*]Bean的初始化阶段:对Spring创建的Bean进行属性填充、Aware接口方法回调、执行Bean的后置处理器、执行初始化方法、AOP等
[*]Bean的完成阶段:将生成的Bean放到单例池(singletonObjects)中
[*]Bean的销毁阶段:Spring 容器关闭前,执行Bean的销毁方法。
Bean的实例化流程【加载Bean信息】
[*]将Bean的信息封装成一个BeanDefinition对象
--org.springframework.beans.factory.support.BeanDefinitionReaderUtils#createBeanDefinition
public static AbstractBeanDefinition createBeanDefinition(
String parentName, String className, ClassLoader classLoader) throws ClassNotFoundException {
GenericBeanDefinition bd = new GenericBeanDefinition();
bd.setParentName(parentName);
if (className != null) {
if (classLoader != null) {
bd.setBeanClass(ClassUtils.forName(className, classLoader));
}
else {
bd.setBeanClassName(className);
}
}
return bd;
}View Code
[*]将所有的BeanDefinition存储到BeanDefinitionMap中
--org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerBeanDefinition
public static void registerBeanDefinition(
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
throws BeanDefinitionStoreException {
// Register bean definition under primary name.
String beanName = definitionHolder.getBeanName();
registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
// Register aliases for bean name, if any.
String[] aliases = definitionHolder.getAliases();
if (aliases != null) {
for (String alias : aliases) {
registry.registerAlias(beanName, alias);
}
}
}View Code
[*]通过BeanFactory的后置处理器对BeanDefinitionMap进行操作【详见 Spring之后置处理器】
[*]Spring框架(ApplicaitonContext)对BeanDefinitionMap进行遍历,利用反射创建Bean对象
public void preInstantiateSingletons() throws BeansException {
List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);
for (String beanName : beanNames) {
//省略代码
getBean(beanName);
}
}View Code
Bean的初始化阶段【生成Bean】
[*]创建Bean的实例
--org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
throws BeanCreationException {
//实例化Bean
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
//代码省略
...
Object exposedObject = bean;
try {
//属性赋值(依赖注入)
populateBean(beanName, mbd, instanceWrapper);
if (exposedObject != null) {
//初始化:包含Aware接口方法回调、BeanPostProcessor接口的回调、初始化方法的调用
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
return exposedObject;
}View Code
[*]给Bean的属性赋值【依赖注入的方式详见 2. Spring IoC&DI】
--org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
PropertyValues pvs = mbd.getPropertyValues();
//代码省略
...
this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
}View Code
[*]Aware接口方法回调
--org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods
private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware)bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
((BeanClassLoaderAware)bean).setBeanClassLoader(this.getBeanClassLoader());
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware)bean).setBeanFactory(this);
}
}
}View Code
[*]调用BeanPostProcessor.postProcessBeforeInitialization方法【BeanPostProcessor接口的具体实现详见 Spring之后置处理器】
[*]如果用户没有编写自定义的BeanPostProcessor,则该步骤执行空方法
--org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}View Code
[*]调用Bean的初始化方法【详见 5. Bean的初始化方式】
--org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
//调用InitializingBean的实现类
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
((InitializingBean) bean).afterPropertiesSet();
return null;
}
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
((InitializingBean) bean).afterPropertiesSet();
}
}
//调用init-method
if (mbd != null) {
String initMethodName = mbd.getInitMethodName();
if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}View Code
[*]调用BeanPostProcessor.postProcessAfterInitialization方法【详见 Spring之后置处理器】
[*]如果用户没有编写自定义的BeanPostProcessor,则该步骤执行空方法
--org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessAfterInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}View Code
Bean的完成阶段【将Bean注入单例池】
[*]创建好的Bean对象会存储到名为singletonObjects的Map中
--org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingleton
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
this.singletonFactories.remove(beanName);
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
}
}View Code
[*]获取Bean
--org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
synchronized (this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}View Code
Bean的销毁阶段
[*]调用Bean的销毁方法(在容器关闭的时候调用)
https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif--org.springframework.context.support.AbstractApplicationContext#destroyBeans
protected void destroyBeans() {
this.getBeanFactory().destroySingletons();
}View Code
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页:
[1]