找回密码
 立即注册
首页 业界区 安全 Spring原理之Bean生命周期

Spring原理之Bean生命周期

蛟当罟 2025-5-30 15:18:04
 
Spring Bean的生命周期是指Bean从创建到销毁的整个过程,大致分为4个阶段:

  • Bean的实例化阶段:Spring容器根据BeanDefinition信息,通过反射创建对象;
  • Bean的初始化阶段:对Spring创建的Bean进行属性填充、Aware接口方法回调、执行Bean的后置处理器、执行初始化方法、AOP等
  • Bean的完成阶段:将生成的Bean放到单例池(singletonObjects)中
  • Bean的销毁阶段:Spring 容器关闭前,执行Bean的销毁方法。
1.png

 
Bean的实例化流程【加载Bean信息】

  • 将Bean的信息封装成一个BeanDefinition对象
2.gif
3.gif
  1. --org.springframework.beans.factory.support.BeanDefinitionReaderUtils#createBeanDefinition
  2. public static AbstractBeanDefinition createBeanDefinition(
  3.       String parentName, String className, ClassLoader classLoader) throws ClassNotFoundException {
  4.    GenericBeanDefinition bd = new GenericBeanDefinition();
  5.    bd.setParentName(parentName);
  6.    if (className != null) {
  7.       if (classLoader != null) {
  8.          bd.setBeanClass(ClassUtils.forName(className, classLoader));
  9.       }
  10.       else {
  11.          bd.setBeanClassName(className);
  12.       }
  13.    }
  14.    return bd;
  15. }
复制代码
View Code

  • 将所有的BeanDefinition存储到BeanDefinitionMap中
4.gif
5.gif
  1. --org.springframework.beans.factory.support.BeanDefinitionReaderUtils#registerBeanDefinition
  2. public static void registerBeanDefinition(
  3.       BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)
  4.       throws BeanDefinitionStoreException {
  5.    // Register bean definition under primary name.
  6.    String beanName = definitionHolder.getBeanName();
  7.    registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());
  8.    // Register aliases for bean name, if any.
  9.    String[] aliases = definitionHolder.getAliases();
  10.    if (aliases != null) {
  11.       for (String alias : aliases) {
  12.          registry.registerAlias(beanName, alias);
  13.       }
  14.    }
  15. }
复制代码
View Code

  • 通过BeanFactory的后置处理器对BeanDefinitionMap进行操作【详见 Spring之后置处理器】
  • Spring框架(ApplicaitonContext)对BeanDefinitionMap进行遍历,利用反射创建Bean对象
6.gif
7.gif
  1. public void preInstantiateSingletons() throws BeansException {
  2.    
  3.    List<String> beanNames = new ArrayList<String>(this.beanDefinitionNames);
  4.    for (String beanName : beanNames) {
  5.             //省略代码
  6.       getBean(beanName);
  7.    }
  8. }
复制代码
View Code 
Bean的初始化阶段【生成Bean】

  • 创建Bean的实例
8.gif
9.gif
  1. --org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
  2. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
  3.       throws BeanCreationException {
  4.    //实例化Bean
  5.    BeanWrapper instanceWrapper = null;
  6.    if (mbd.isSingleton()) {
  7.       instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  8.    }
  9.    if (instanceWrapper == null) {
  10.       instanceWrapper = createBeanInstance(beanName, mbd, args);
  11.    }
  12.    final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
  13.    Class<?> beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
  14.     //代码省略
  15.         ...
  16.    Object exposedObject = bean;
  17.    try {
  18.       //属性赋值(依赖注入)
  19.       populateBean(beanName, mbd, instanceWrapper);
  20.       if (exposedObject != null) {
  21.          //初始化:包含Aware接口方法回调、BeanPostProcessor接口的回调、初始化方法的调用
  22.          exposedObject = initializeBean(beanName, exposedObject, mbd);
  23.       }
  24.    }
  25.    return exposedObject;
  26. }
复制代码
View Code

  • 给Bean的属性赋值【依赖注入的方式详见 2. Spring IoC&DI】
10.gif
11.gif
  1. --org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
  2. protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {
  3.     PropertyValues pvs = mbd.getPropertyValues();
  4.     //代码省略
  5.     ...
  6.     this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
  7. }
复制代码
View Code

  • Aware接口方法回调
12.gif
13.gif
  1. --org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeAwareMethods
  2. private void invokeAwareMethods(String beanName, Object bean) {
  3.     if (bean instanceof Aware) {
  4.         if (bean instanceof BeanNameAware) {
  5.             ((BeanNameAware)bean).setBeanName(beanName);
  6.         }
  7.         if (bean instanceof BeanClassLoaderAware) {
  8.             ((BeanClassLoaderAware)bean).setBeanClassLoader(this.getBeanClassLoader());
  9.         }
  10.         if (bean instanceof BeanFactoryAware) {
  11.             ((BeanFactoryAware)bean).setBeanFactory(this);
  12.         }
  13.     }
  14. }
复制代码
View Code

  • 调用BeanPostProcessor.postProcessBeforeInitialization方法【BeanPostProcessor接口的具体实现详见  Spring之后置处理器】

    • 如果用户没有编写自定义的BeanPostProcessor,则该步骤执行空方法

14.gif
15.gif
  1. --org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization
  2. public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
  3.       throws BeansException {
  4.    Object result = existingBean;
  5.    for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
  6.       result = beanProcessor.postProcessBeforeInitialization(result, beanName);
  7.       if (result == null) {
  8.          return result;
  9.       }
  10.    }
  11.    return result;
  12. }
复制代码
View Code

  • 调用Bean的初始化方法【详见 5. Bean的初始化方式】
16.gif
17.gif
  1. --org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods
  2. protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
  3.       throws Throwable {
  4.     //调用InitializingBean的实现类
  5.    boolean isInitializingBean = (bean instanceof InitializingBean);
  6.    if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
  7.       if (System.getSecurityManager() != null) {
  8.          try {
  9.             AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
  10.                @Override
  11.                public Object run() throws Exception {
  12.                   ((InitializingBean) bean).afterPropertiesSet();
  13.                   return null;
  14.                }
  15.             }, getAccessControlContext());
  16.          }
  17.          catch (PrivilegedActionException pae) {
  18.             throw pae.getException();
  19.          }
  20.       }
  21.       else {
  22.          ((InitializingBean) bean).afterPropertiesSet();
  23.       }
  24.    }
  25.     //调用init-method
  26.    if (mbd != null) {
  27.       String initMethodName = mbd.getInitMethodName();
  28.       if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
  29.             !mbd.isExternallyManagedInitMethod(initMethodName)) {
  30.          invokeCustomInitMethod(beanName, bean, mbd);
  31.       }
  32.    }
  33. }
复制代码
View Code

  • 调用BeanPostProcessor.postProcessAfterInitialization方法【详见  Spring之后置处理器】

    • 如果用户没有编写自定义的BeanPostProcessor,则该步骤执行空方法

18.gif
19.gif
  1. --org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
  2. public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
  3.       throws BeansException {
  4.    Object result = existingBean;
  5.    for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
  6.       result = beanProcessor.postProcessAfterInitialization(result, beanName);
  7.       if (result == null) {
  8.          return result;
  9.       }
  10.    }
  11.    return result;
  12. }
复制代码
View Code 
Bean的完成阶段【将Bean注入单例池】

  • 创建好的Bean对象会存储到名为singletonObjects的Map中
22.gif
21.gif
  1. --org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingleton
  2. protected void addSingleton(String beanName, Object singletonObject) {
  3.    synchronized (this.singletonObjects) {
  4.       this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
  5.       this.singletonFactories.remove(beanName);
  6.       this.earlySingletonObjects.remove(beanName);
  7.       this.registeredSingletons.add(beanName);
  8.    }
  9. }
复制代码
View Code

  • 获取Bean
24.gif
23.gif
  1. --org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean)
  2. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  3.    Object singletonObject = this.singletonObjects.get(beanName);
  4.    if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
  5.       synchronized (this.singletonObjects) {
  6.          singletonObject = this.earlySingletonObjects.get(beanName);
  7.          if (singletonObject == null && allowEarlyReference) {
  8.             ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
  9.             if (singletonFactory != null) {
  10.                singletonObject = singletonFactory.getObject();
  11.                this.earlySingletonObjects.put(beanName, singletonObject);
  12.                this.singletonFactories.remove(beanName);
  13.             }
  14.          }
  15.       }
  16.    }
  17.    return (singletonObject != NULL_OBJECT ? singletonObject : null);
  18. }
复制代码
View Code 
Bean的销毁阶段

  • 调用Bean的销毁方法(在容器关闭的时候调用)
25.gif
  1. --org.springframework.context.support.AbstractApplicationContext#destroyBeans
  2. protected void destroyBeans() {
  3.     this.getBeanFactory().destroySingletons();
  4. }
复制代码
View Code 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册