`
徜徉の小溪
  • 浏览: 447995 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Bean在Spring容器中的生命周期

阅读更多

   Bean在Spring容器中的生命周期

配置在Spring中的Bean在Spring容器中从加载到销毁会经历那些过程呢?如果实现一些特定的Spring接口,这些特定接口的方法会在什么时候被调用呢?本文简单介绍一下这些过程.

Bean在Spring容器中的生命周期如下图所示:

 

1,调用Bean的构造函数(或者工厂方法)实例化Bean.
2,对Bean的成员变量赋值.
3,如果Bean实现了BeanNameAware,调用Bean的setBeanName方法.
4,如果Bean实现了BeanFactoryAware,调用Bean的setBeanFactory方法.
5,如果Bean实现了ApplicationContextAware,调用Bean的setApplicationContext方法.
6,如果容器中配置了BeanPostProcessor,调用BeanPostProcessor的postProcessBeforeInitialization方法(如果有多个BeanPostProcessor,调用每一个BeanPostProcessor的postProcessBeforeInitialization方法).
6,如果Bean实现了InitializingBean,调用Bean的afterPropertiesSet方法.
7,如果Bean配置了init-method方法,调用init-method配置的Bean方法.
8,如果容器中配置了BeanPostProcessor,调用BeanPostProcessor的postProcessAfterInitialization方法.(如果有多个BeanPostProcessor,调用每一个BeanPostProcessor的postProcessAfterInitialization方法).
9,Bean处于可以使用的状态.
10,Spring容器关闭.
11,4,如果Bean实现了DisposableBean,调用Bean的destroy方法.
12,如果Bean配置了destroy-method方法,调用destroy-method配置的Bean的方法.

实例:LifeCycleBean implements InitializingBean, DisposableBean,BeanNameAware,BeanFactoryAware, ApplicationContextAware,配置了init-method="init" destroy-method="cleanup",容器中有两个BeanPostProcessor

 

[java] view plaincopy
  1. public class LifeCycleBean implements InitializingBean, DisposableBean,  
  2.         BeanNameAware,BeanFactoryAware, ApplicationContextAware {  
  3.     private String str = "default";  
  4.     public LifeCycleBean() {  
  5.         System.out.println("construct LifecycleBean ***************");  
  6.     }  
  7.     public LifeCycleBean(String str) {  
  8.         this.str = str;  
  9.     }  
  10.     public String getStr() {  
  11.         return str;  
  12.     }  
  13.     public void setStr(String str) {  
  14.         System.out.println("setStr ***************");  
  15.         this.str = str;  
  16.     }  
  17.     public void init() {  
  18.         System.out.println("init mtd ***************");  
  19.     }  
  20.     public void cleanup() {  
  21.         System.out.println("cleanup mtd ***************");  
  22.     }  
  23.       
  24.     public void afterPropertiesSet() throws Exception {  
  25.         System.out.println("afterPropertiesSet ***************");  
  26.     }  
  27.     public void destroy() throws Exception {  
  28.         System.out.println("destroy ***************");  
  29.     }     
  30.     public void setApplicationContext(ApplicationContext arg0)  
  31.             throws BeansException {  
  32.         System.out.println("setApplicationContext***************");  
  33.     }  
  34.     public void setBeanFactory(BeanFactory arg0) throws BeansException {  
  35.         System.out.println("setBeanFactory***************");  
  36.     }  
  37.     public void setBeanName(String arg0) {  
  38.         System.out.println("setBeanName***************" + arg0);              
  39.     }  
  40. }  
  41. public class MyBeanPostProcessor implements BeanPostProcessor {  
  42.     public Object postProcessBeforeInitialization(Object bean, String beanName)  
  43.             throws BeansException {  
  44.         System.out.println("************** MyBeanPostProcessor postProcessBeforeInitialization Bean '" + beanName);  
  45.         return bean;  
  46.     }  
  47.     public Object postProcessAfterInitialization(Object bean, String beanName)  
  48.             throws BeansException {  
  49.         System.out.println("************** MyBeanPostProcessor postProcessAfterInitialization Bean '" + beanName);  
  50.         return bean;  
  51.     }  
  52. }  
Spring配置
[html] view plaincopy
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"  
  3.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  4.     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  
  5.     <bean class="com.test.spring.beanfactoryCtx.MyBeanPostProcessor" />  
  6.     <bean class="com.test.spring.beanfactoryCtx.MyBeanPostProcessor1" />  
  7.     <bean name="lifeCycleBean" class="com.test.spring.beanfactoryCtx.LifeCycleBean" init-method="init" destroy-method="cleanup">  
  8.         <property name="str" value="test str"/>  
  9.     </bean>  
  10. </beans>  
调用代码:注意在从main方法启动Spring的话,需要registerShutdownHook才能看到destroy方法和由destroy-method配置的方法的调用.
[java] view plaincopy
  1. ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:conf/bfactoryCtx1.xml");  
  2. ((ClassPathXmlApplicationContext)ctx).registerShutdownHook();  
  3. LifeCycleBean bean1 = ctx.getBean("lifeCycleBean",LifeCycleBean.class);  
  4. System.out.println("***********" + bean1 +  "   " + bean1.getStr());  
输出结果如下:
[java] view plaincopy
  1. construct LifecycleBean ***************  
  2. setStr ***************       #1  
  3. setBeanName***************lifeCycleBean  
  4. setBeanFactory***************  
  5. setApplicationContext***************  
  6. ************** MyBeanPostProcessor postProcessBeforeInitialization Bean 'lifeCycleBean  #2  
  7. ************** MyBeanPostProcessor1 postProcessBeforeInitialization Bean 'lifeCycleBean #2  
  8. afterPropertiesSet ***************  
  9. init mtd ***************  
  10. ************** MyBeanPostProcessor postProcessAfterInitialization Bean 'lifeCycleBean   #2  
  11. ************** MyBeanPostProcessor1 postProcessAfterInitialization Bean 'lifeCycleBean  #2  
  12. ***********com.test.spring.beanfactoryCtx.LifeCycleBean@157fb52   test4                 #3  
  13. destroy ***************  
  14. cleanup mtd ***************  
#1为成员变量赋值的步骤
#2如果有多个BeanPostProcessor的话,每一个BeanPostProcessor都会被调用一次.
#3Bean 被客户端代码使用
分享到:
评论

相关推荐

    spring bean的生命周期

    在Spring中,Bean的生命周期主要分为以下几个阶段: 1. **初始化阶段** - **实例化**:Spring通过`Class.forName()`或`new`关键字实例化Bean。如果在XML配置中指定了`class`属性,Spring将根据该属性创建Bean。 -...

    spring bean的生命周期测试代码

    在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程。本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们...

    Spring的bean生命周期

    在Spring中,Bean的生命周期包括以下几个关键阶段: 1. **实例化**:当Spring容器(如ApplicationContext)启动时,它会读取配置文件(XML或Java配置),根据配置创建Bean的实例。实例化可以通过无参构造函数或者...

    Spring Bean生命周期.pdf

    这使得它可以在Bean的生命周期中多个点进行干预,例如,在属性赋值之后修改属性值,这在Spring的自动注入和AOP实现中非常有用。 - BeanPostProcessor:这个接口允许在Bean初始化之前和之后进行扩展。它用于修改Bean...

    Spring bean生命周期demo

    在Spring框架中,Bean的生命周期是指从创建到销毁的整个过程。这个过程包含了初始化、正常使用以及最终的销毁几个阶段。了解并掌握Spring Bean的生命周期对于优化应用性能和资源管理至关重要。接下来,我们将深入...

    Spring框架中Bean的生命周期 Spring中Bean有几种作用域

    在Spring框架中,Bean的生命周期管理和作用域是其核心特性之一,它们对于理解Spring如何管理对象的创建、初始化、使用以及销毁至关重要。首先,我们来深入探讨Bean的生命周期。 Spring中的Bean生命周期主要分为两个...

    Spring Bean 的生命周期

    2. **属性注入**:Spring容器将根据Bean定义中的属性值、setter方法或构造函数参数来设置Bean的依赖。这包括了基本类型、其他Bean引用、集合类型的依赖等。 3. **初始化回调**:Spring容器调用Bean的`init-method`...

    Spring中Bean的生命周期 applicationcontext的应用(实现国际化,事件的传递)

    在Spring框架中,Bean的生命周期管理和ApplicationContext的应用是两个核心概念,它们对于理解Spring如何管理和协调应用中的对象至关重要。本文将深入探讨这两个主题,并结合国际化(i18n)和事件传递来阐述它们在...

    spring中service生命周期(xml/annotation)

    在上面的例子中,当Spring容器创建`myService` Bean时,会调用`init`方法进行初始化,而在Bean被销毁时调用`destroy`方法进行资源清理。 在转向注解配置之前,我们需要理解Spring的@Component、@Service、@...

    Spring Bean 的生命周期.docx

    在这个过程中,Spring容器提供了多个关键接口和回调方法,使得开发者能够自定义Bean的行为。 首先,BeanFactory是Spring中最基础的容器,它负责Bean的实例化。在BeanFactory中,Bean的生命周期主要涉及以下接口: ...

    浅谈Spring中Bean的作用域、生命周期

    Spring容器可以管理singleton作用域下Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。 对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的...

    Spring管理的Bean的生命周期

    在Bean的生命周期中,Spring还提供了对Bean的属性进行动态调整的能力,例如通过`PropertyPlaceholderConfigurer`或`@Value`注解来设置Bean的属性值。 在Bean完成其职责后,最终会到达销毁阶段。销毁有两种方式: 1...

    谈谈我对Spring Bean 生命周期的理解

    容器会在 Bean 的整个生命周期中执行不同的方法,包括实例化、设置属性、依赖注入、初始化、使用和销毁等阶段。 六、 小结 Spring Bean 生命周期是 Spring 框架中的一个核心概念,掌握 Spring Bean 生命周期可以...

    SSH笔记-IOC容器中 Bean 的生命周期

    在Spring框架中,IOC(Inversion of Control,控制反转)容器是核心组件,它负责管理对象的生命周期,也就是Bean的生命周期。这篇SSH笔记主要探讨了如何在Spring4中利用BeanPostProcessor接口定制Bean的初始化和销毁...

    Spring之核心容器bean

    Spring容器对bean的生命周期进行管理,包括初始化、活跃期和销毁。你可以为bean定义初始化方法和销毁方法,容器会在适当的时候调用。此外,还可以通过实现InitializingBean和DisposableBean接口,或者使用`@...

    尚硅谷]_佟刚_Spring IOC 容器中 Bean 的生命周期.pdf

    1、&lt;bean&gt;标签主要用来进行Bean定义; 2、alias用于定义Bean别名的; 3、import用于导入其他配置文件的Bean定义,这是为了加载多个配置文件,当然也可以把这些配置文件构造为一个数组(new String[] {“config1.xml...

    Spring Bean生命周期&BeanDefinitions1

    默认情况下,Bean的scope为"singleton",表示Spring容器只创建一个实例,并将其缓存。如果scope设为"prototype",每次请求都会创建一个新的Bean实例。 7. **销毁**:当容器关闭时,如果是"singleton"作用域的Bean,...

    12-17Spring容器中有关bean的生命周期的学习,脑图

    12-17Spring容器中有关bean的生命周期的学习,脑图

    深度解析spring容器管理bean

    "深度解析spring容器管理bean"这一主题,旨在深入理解Spring如何通过反射机制、依赖注入(DI)以及XML或Java配置来实现对Bean的生命周期管理。 首先,Spring容器主要有两种类型:DefaultListableBeanFactory和...

    深入了解Spring中Bean的作用域和生命周期

    在 Spring 框架中,Bean 的作用域和生命周期是两个非常重要的概念,它们决定了 Bean 的实例化和生命周期。了解 Spring 中 Bean 的作用域和生命周期是非常重要的,这将有助于开发者更好地使用 Spring 框架。 Bean 的...

Global site tag (gtag.js) - Google Analytics