Spring-2、Spring Bean 的生命周期

Spring框架中,一旦把一个Bean纳入Spring IOC容器之中,这个Bean的生命周期就会交由容器进行管理,一般担当管理角色的是BeanFactory或者ApplicationContext,认识一下Bean的生命周期活动,对更好的利用它有很大的帮助:

下面以BeanFactory为例,说明一个Bean的生命周期活动

  • Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例
  • Setter注入,执行Bean的属性依赖注入
  • BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法
  • BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法
  • BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法
  • InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法
  • Bean定义文件中定义init-method
  • BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法
  • DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法
  • Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法

如果使用ApplicationContext来维护一个Bean的生命周期,则基本上与上边的流程相同,只不过在执行BeanNameAware的setBeanName()后,若有Bean类实现了org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,然后再进行BeanPostProcessors的processBeforeInitialization()
实际上,ApplicationContext除了向BeanFactory那样维护容器外,还提供了更加丰富的框架功能,如Bean的消息,事件处理机制等。

在这里一用仓颉的一幅图说明流程: 转载自 https://www.cnblogs.com/xrq730/p/6363055.html

以下是自己测试时打印的日志信息,可以看下加载顺序:

 1 /**
 2  * @ClassName: MySpringBean
 3  * @Description: my spring bean to test
 4  * @author: daniel.zhao
 5  * @date: 2018年10月26日 上午10:12:37
 6  */
 7 public class MySpringBean implements BeanNameAware, BeanFactoryAware, InitializingBean, ApplicationContextAware {
 8
 9     private ApplicationContext applicationContext;
10
11     private static final Logger logger = LoggerFactory.getLogger(MySpringBean.class);
12
13     public MySpringBean() {
14         logger.info("new MySpringBean......");
15     }
16
17     @Override
18     public void setApplicationContext(ApplicationContext context) throws BeansException {
19         logger.info("ApplicationContextAware-setApplicationContext......");
20         this.applicationContext = context;
21     }
22
23     @Override
24     public void afterPropertiesSet() throws Exception {
25         logger.info("InitializingBean-afterPropertiesSet......");
26     }
27
28     @Override
29     public void setBeanFactory(BeanFactory bf) throws BeansException {
30         logger.info("BeanFactoryAware-setBeanFactory......");
31     }
32
33     @Override
34     public void setBeanName(String name) {
35         logger.info("BeanNameAware-setBeanName......");
36     }
37
38     public void init() {
39         logger.info("init-method......");
40     }
41 }

/**
 * @ClassName: MySpringBeanPostProcessor
 * @author: daniel.zhao
 * @date: 2018年10月26日 上午10:40:21
 */
@Component
public class MySpringBeanPostProcessor implements BeanPostProcessor {

    private static final Logger logger = LoggerFactory.getLogger(MySpringBeanPostProcessor.class);

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof MySpringBean) {
            logger.info("BeanPostProcessor-postProcessAfterInitialization......");
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof MySpringBean) {
            logger.info("BeanPostProcessor-postProcessBeforeInitialization......");
        }
        return bean;
    }

}

2018-10-26 10:49:48.768  INFO 5732 --- [           main] com.daniel.bean.MySpringBean             : BeanNameAware-setBeanName......2018-10-26 10:49:48.769  INFO 5732 --- [           main] com.daniel.bean.MySpringBean             : BeanFactoryAware-setBeanFactory......2018-10-26 10:49:48.769  INFO 5732 --- [           main] com.daniel.bean.MySpringBean             : ApplicationContextAware-setApplicationContext......2018-10-26 10:49:48.770  INFO 5732 --- [           main] c.daniel.bean.MySpringBeanPostProcessor  : BeanPostProcessor-postProcessBeforeInitialization......2018-10-26 10:49:48.770  INFO 5732 --- [           main] com.daniel.bean.MySpringBean             : InitializingBean-afterPropertiesSet......2018-10-26 10:49:48.770  INFO 5732 --- [           main] com.daniel.bean.MySpringBean             : init-method......2018-10-26 10:49:48.771  INFO 5732 --- [           main] c.daniel.bean.MySpringBeanPostProcessor  : BeanPostProcessor-postProcessAfterInitialization......

原文地址:https://www.cnblogs.com/chenxiaoxian/p/10430791.html

时间: 2024-12-13 07:47:45

Spring-2、Spring Bean 的生命周期的相关文章

Spring管理的Bean的生命周期

bean的初始化时机 前面讲解了Spring容器管理的bean的作用域.接着我们就要思考一个问题:bean到底是在什么时候才进行实例化的呢?我们以这个问题为引子来展开本文的说明. bean对象无外乎是在以下两个时刻进行实例化的: 调用getBean()方法时. Spring容器启动时. 那么bean对象到底是在哪个时刻进行实例化的,这与Bean的作用域有着某种联系.我们以配置Spring管理的bean的作用域的案例为基础进行深入探讨.为了能够清楚地看到bean对象的实例化,我们需要修改Perso

Spring容器中Bean的生命周期

日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也有属于它的生命周期. 人类大脑对图像的认知能力永远高于文字,因此,闲言少叙,书归正传,上图先: 步骤很多,切莫惊慌,我们可以把上面的步骤归纳如下: 1-2:创建实例: 现在假设spring就是个容器,而配置文件中配置的bean属性才是我们真正需要的东西.创建实例就是说,我把配置文件中的bean信息取出来化作一个真正的bean并放到容器中. 3-4:注入依赖关系:

Spring基础14——Bean的生命周期

1.IOC容器中的Bean的生命周期方法 SpringIOC容器可以管理Bean的生命周期,Spring允许在Bean生命周期的特定点执行定制的任务.SpringIOC容器对Bean的生命周期进行管理的过程: 1)通过构造器或工厂方法创建Bean实例 2)为bean的属性设置值和对其他bean的引用 3)调用Bean的初始化方法 4)Bean可以使用了 5)当容器关闭时,调用Bean的销毁方法 2.验证bean的生命周期 我们可以在Spring的配置文件中声明init-method属性和dest

spring中的bean的生命周期

bean的生命周期:bean的创建 —— 初始化 ——销毁的过程 容器管理bean的生命周期,我们可以自定义初始化和销毁方法,容器在bean进行到当前生命周期就会调用我们的方法 在xml配置文件中是在bean的标签内使用init-method和destroy-method <bean id="person" class="com.springbean.Person" init-method="" destroy-method="&

spring ApplicationContext中Bean的生命周期

AbstractApplicationContext Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh方法定义了spring容器在加载配置文件后的各项处理过程 public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { prepareRe

深入剖析Spring(三)——Bean的生命周期

对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下: 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化. 对于ApplicationContext容器,当容器启动结束后,便实例化所有的bean. 容器通

Spring 框架基础(02):Bean的生命周期,作用域,装配总结

本文源码:GitHub·点这里 || GitEE·点这里 一.装配方式 Bean的概念:Spring框架管理的应用程序中,由Spring容器负责创建,装配,设置属性,进而管理整个生命周期的对象,称为Bean对象. 1.XML格式装配 Spring最传统的Bean的管理方式. 配置方式 <bean id="userInfo" class="com.spring.mvc.entity.UserInfo"> <property name="na

Spring中Bean的生命周期

Spring中Bean的生命周期过程: 1.Spring对Bean进行实例化(相当于程序中的new Xx()) 2.Spring将值和Bean的引用注入进Bean对应的属性中 3如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()方法 (实现BeanNameAware清主要是为了通过Bean的引用来获得Bean的ID,一般业务中是很少有在Bean的ID的) 4.如果Bean实现了BeanFactoryAware接口,Spring将调用se

Spring中Bean的生命周期方法

Bean的生命周期方法 src\dayday\Car.java package dayday; import com.sun.org.apache.xpath.internal.SourceTree; import javax.sound.midi.Soundbank; /** * Created by I am master on 2016/11/28. */public class Car { private String name; public void setName(String n

Spring Bean的生命周期

Bean的初始化过程已经被Spring完全包装起来了,无法人工干预. Spring预留了两个回调方法的入口 回调方法:定义出来完成一定的功能,提供给回调者/服务器/上层容器调用的方法,叫做回调方法. Bean类 public class Bean1 { public Bean1() { //System.out.println("bean1...构造方法"); } public void show(){ System.out.println("bean1...方法"