配置在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
- public class LifeCycleBean implements InitializingBean, DisposableBean,
- BeanNameAware,BeanFactoryAware, ApplicationContextAware {
- private String str = "default";
- public LifeCycleBean() {
- System.out.println("construct LifecycleBean ***************");
- }
- public LifeCycleBean(String str) {
- this.str = str;
- }
- public String getStr() {
- return str;
- }
- public void setStr(String str) {
- System.out.println("setStr ***************");
- this.str = str;
- }
- public void init() {
- System.out.println("init mtd ***************");
- }
- public void cleanup() {
- System.out.println("cleanup mtd ***************");
- }
- public void afterPropertiesSet() throws Exception {
- System.out.println("afterPropertiesSet ***************");
- }
- public void destroy() throws Exception {
- System.out.println("destroy ***************");
- }
- public void setApplicationContext(ApplicationContext arg0)
- throws BeansException {
- System.out.println("setApplicationContext***************");
- }
- public void setBeanFactory(BeanFactory arg0) throws BeansException {
- System.out.println("setBeanFactory***************");
- }
- public void setBeanName(String arg0) {
- System.out.println("setBeanName***************" + arg0);
- }
- }
- public class MyBeanPostProcessor implements BeanPostProcessor {
- public Object postProcessBeforeInitialization(Object bean, String beanName)
- throws BeansException {
- System.out.println("************** MyBeanPostProcessor postProcessBeforeInitialization Bean '" + beanName);
- return bean;
- }
- public Object postProcessAfterInitialization(Object bean, String beanName)
- throws BeansException {
- System.out.println("************** MyBeanPostProcessor postProcessAfterInitialization Bean '" + beanName);
- return bean;
- }
- }
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <bean class="com.test.spring.beanfactoryCtx.MyBeanPostProcessor" />
- <bean class="com.test.spring.beanfactoryCtx.MyBeanPostProcessor1" />
- <bean name="lifeCycleBean" class="com.test.spring.beanfactoryCtx.LifeCycleBean" init-method="init" destroy-method="cleanup">
- <property name="str" value="test str"/>
- </bean>
- </beans>
- ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:conf/bfactoryCtx1.xml");
- ((ClassPathXmlApplicationContext)ctx).registerShutdownHook();
- LifeCycleBean bean1 = ctx.getBean("lifeCycleBean",LifeCycleBean.class);
- System.out.println("***********" + bean1 + " " + bean1.getStr());
- construct LifecycleBean ***************
- setStr *************** #1
- setBeanName***************lifeCycleBean
- setBeanFactory***************
- setApplicationContext***************
- ************** MyBeanPostProcessor postProcessBeforeInitialization Bean 'lifeCycleBean #2
- ************** MyBeanPostProcessor1 postProcessBeforeInitialization Bean 'lifeCycleBean #2
- afterPropertiesSet ***************
- init mtd ***************
- ************** MyBeanPostProcessor postProcessAfterInitialization Bean 'lifeCycleBean #2
- ************** MyBeanPostProcessor1 postProcessAfterInitialization Bean 'lifeCycleBean #2
- ***********com.test.spring.beanfactoryCtx.LifeCycleBean@157fb52 test4 #3
- destroy ***************
- cleanup mtd ***************
#2如果有多个BeanPostProcessor的话,每一个BeanPostProcessor都会被调用一次.
#3Bean 被客户端代码使用
相关推荐
在Spring中,Bean的生命周期主要分为以下几个阶段: 1. **初始化阶段** - **实例化**:Spring通过`Class.forName()`或`new`关键字实例化Bean。如果在XML配置中指定了`class`属性,Spring将根据该属性创建Bean。 -...
在Spring框架中,Bean的生命周期管理是其核心特性之一,它允许开发者控制Bean从创建到销毁的整个过程。本资源提供了在Spring 4.2环境下关于Bean生命周期的测试代码,帮助我们深入理解这一关键概念。 首先,让我们...
在Spring中,Bean的生命周期包括以下几个关键阶段: 1. **实例化**:当Spring容器(如ApplicationContext)启动时,它会读取配置文件(XML或Java配置),根据配置创建Bean的实例。实例化可以通过无参构造函数或者...
这使得它可以在Bean的生命周期中多个点进行干预,例如,在属性赋值之后修改属性值,这在Spring的自动注入和AOP实现中非常有用。 - BeanPostProcessor:这个接口允许在Bean初始化之前和之后进行扩展。它用于修改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如何管理和协调应用中的对象至关重要。本文将深入探讨这两个主题,并结合国际化(i18n)和事件传递来阐述它们在...
在上面的例子中,当Spring容器创建`myService` Bean时,会调用`init`方法进行初始化,而在Bean被销毁时调用`destroy`方法进行资源清理。 在转向注解配置之前,我们需要理解Spring的@Component、@Service、@...
在这个过程中,Spring容器提供了多个关键接口和回调方法,使得开发者能够自定义Bean的行为。 首先,BeanFactory是Spring中最基础的容器,它负责Bean的实例化。在BeanFactory中,Bean的生命周期主要涉及以下接口: ...
Spring容器可以管理singleton作用域下Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。 对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的...
在Bean的生命周期中,Spring还提供了对Bean的属性进行动态调整的能力,例如通过`PropertyPlaceholderConfigurer`或`@Value`注解来设置Bean的属性值。 在Bean完成其职责后,最终会到达销毁阶段。销毁有两种方式: 1...
容器会在 Bean 的整个生命周期中执行不同的方法,包括实例化、设置属性、依赖注入、初始化、使用和销毁等阶段。 六、 小结 Spring Bean 生命周期是 Spring 框架中的一个核心概念,掌握 Spring Bean 生命周期可以...
在Spring框架中,IOC(Inversion of Control,控制反转)容器是核心组件,它负责管理对象的生命周期,也就是Bean的生命周期。这篇SSH笔记主要探讨了如何在Spring4中利用BeanPostProcessor接口定制Bean的初始化和销毁...
Spring容器对bean的生命周期进行管理,包括初始化、活跃期和销毁。你可以为bean定义初始化方法和销毁方法,容器会在适当的时候调用。此外,还可以通过实现InitializingBean和DisposableBean接口,或者使用`@...
1、<bean>标签主要用来进行Bean定义; 2、alias用于定义Bean别名的; 3、import用于导入其他配置文件的Bean定义,这是为了加载多个配置文件,当然也可以把这些配置文件构造为一个数组(new String[] {“config1.xml...
默认情况下,Bean的scope为"singleton",表示Spring容器只创建一个实例,并将其缓存。如果scope设为"prototype",每次请求都会创建一个新的Bean实例。 7. **销毁**:当容器关闭时,如果是"singleton"作用域的Bean,...
12-17Spring容器中有关bean的生命周期的学习,脑图
"深度解析spring容器管理bean"这一主题,旨在深入理解Spring如何通过反射机制、依赖注入(DI)以及XML或Java配置来实现对Bean的生命周期管理。 首先,Spring容器主要有两种类型:DefaultListableBeanFactory和...
在 Spring 框架中,Bean 的作用域和生命周期是两个非常重要的概念,它们决定了 Bean 的实例化和生命周期。了解 Spring 中 Bean 的作用域和生命周期是非常重要的,这将有助于开发者更好地使用 Spring 框架。 Bean 的...