Spring Bean的生命周期详解

Spring Bean的生命周期详解

  Spring IoC容器的本质目的就是为了管理Bean,对于Bean而言,在容器中存在其生命周期,它的初始化和销毁也需要一个过程,下面主要对其生命周期进行一个详解的解释。生命周期主要是为了了解Spring IoC容器初始化和销毁Bean的过程,通过下图即可以掌握Spring IoC容器初始化与销毁Bean的过程。

  

  通过上图,我们首先可以看到生命周期的步骤。

  1)如果Bean实现了接口 BeanNameAware 的 setBeanName 方法,那么它就会调用这个方法。

  2)如果Bean实现了接口 BeanfactoryAware 的 setBeanFactory 方法,那么它就会调用这个方法。

  3)如果Bean实现了接口 ApplicationContextAware 的 setApplicationContext方法,且 Spring IoC容器也必须是一个 ApplicationContext 接口的实现类,那么才会调用这个方法,否则是不调用的。

  4)如果 Bean 实现了接口 BeanPostProcessor 的 postProcessBeforeInitialization 方法,那么它就会调用这个方法。

  5)如果 Bean 实现了接口 BeanFactoryPostProcessor 的 afterPropertiesSet 方法,那么它就会调用这个方法。

  6)如果 Bean 自定义了初始化方法,它就会调用已定义的初始化方法。

  7)如果 Bean 实现了接口 BeanPostProcessor 的 postProcessAfterInitialization 方法,完成了这些调用,这时候Bean 就完成了初始化,那么Bean 就生存在 Spring IoC容器中,使用者就可以从中获取Bean的服务。

  

  当服务器正常关闭,或者遇到其他关闭Spring IoC容器的事件,它就会调用对应的方法完成Bean的销毁,其步骤如下:

  1)首先如果Bean实现了接口 DisposableBean 的 destory 方法,那么就会调用它。

  2)如果定义了自定义销毁方法,那么就会调用它。

  需要主要的是,上述的关于生命周期的接口,大部分都是针对单个Bean而言的,BeanPostProcessor 接口是针对所有Bean而言的,当一个Bean实现了上述的接口,只需要在Spring IoC容器中定义它就可以,Spring IoC容器会自动识别,并且按顺序执行,下面对BeanPostProcessor 接口进行实现和测试。

BeanPostProcessor 的实现类,处理Spring IoC容器所有的Bean

package com.cnblogs.demrystv.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class BeanPostProcessorImpl implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("【" + bean.getClass().getSimpleName() + "】对象" + beanName + "开始实例化");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("【" + bean.getClass().getSimpleName() + "】对象" + beanName + "实例化完成");
        return bean;
    }

}

测试生命周期

package com.cnblogs.demrystv.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class JuiceMaker implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {
    private String beverageShop = null;
    private Source source = null;

    public String getBeverageShop() {
        return beverageShop;
    }

    public void setBeverageShop(String beverageShop) {
        this.beverageShop = beverageShop;
    }

    public Source getSource() {
        return source;
    }

    public void setSource(Source source) {
        this.source = source;
    }

    public String makeJuice() {
        String juice = "这是一杯由" + beverageShop + "饮品店,提供的" + source.getSize() + source.getSugar() + source.getFruit();
        return juice;
    }

    public void init() {
        System.out.println("【" + this.getClass().getSimpleName() + "】执行自定义初始化方法");
    }

    public void destroy() {
        System.out.println("【" + this.getClass().getSimpleName() + "】执行自定义销毁方法");
    }

    @Override
    public void setBeanName(String arg0) {
        System.out.println("【" + this.getClass().getSimpleName() + "】调用BeanNameAware接口的setBeanName方法");

    }

    @Override
    public void setBeanFactory(BeanFactory arg0) throws BeansException {
        System.out.println("【" + this.getClass().getSimpleName() + "】调用BeanFactoryAware接口的setBeanFactory方法");
    }

    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        System.out.println(
                "【" + this.getClass().getSimpleName() + "】调用ApplicationContextAware接口的setApplicationContext方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("【" + this.getClass().getSimpleName() + "】调用InitializingBean接口的afterPropertiesSet方法");
    }
}

同时,为了使自定义的方法生效,应该在xml中声明自定义的初始化和销毁方法的Bean

  <!--BeanPostProcessor定义 -->
    <bean id="beanPostProcessor" class="com.cnblogs.demrystv.bean.BeanPostProcessorImpl" />

    <bean id="source" class="com.cnblogs.demrystv.pojo.Source">
        <property name="fruit" value="橙汁" />
        <property name="sugar" value="少糖" />
        <property name="size" value="大杯" />
    </bean>

    <bean id="juiceMaker" class="com.cnblogs.demrystv.pojo.JuiceMaker2"
        destroy-method="destroy" init-method="init">
        <property name="beverageShop" value="贡茶" />
        <property name="source" ref="source" />
    </bean>

配置完成后,测试 Spring Bean的生命周期

ClassPathXmlApplicationContext ctx =
                new ClassPathXmlApplicationContext("spring-cfg.xml");
        JuiceMaker juiceMaker = (JuiceMaker) ctx.getBean("juiceMaker");
        System.out.println(juiceMaker.makeJuice());
        ctx.close();

运行它,可以得到下面的日志:

【Source】对象source开始实例化
【Source】对象source实例化完成
【JuiceMaker】调用BeanNameAware接口的setBeanName 方法
【JuiceMaker】调用BeanFactoryAware接口的setBeanFactory方法
【JuiceMaker】调用ApplicationContextAware 接口的setApplicationContext方法
【JuiceMaker】对象juicemaker开始实例化
【JuiceMaker】调用InitializingBean 接口的afterpropertiesSet方法
【JuiceMaker】执行自定义初始化方法
【JuiceMaker】对象juiceMaker 实例化完成
 这是一杯由贡茶饮品店,提供的大杯少糖橙汁
【JuiceMaker】调用DisposableBean接口的destory方法
【JuiceMaker】执行自定义销毁方法

  从日志中就可以发现所有的生命周期的方法都已经被执行了,从打印的日志可以看到,BeanPostProcessor针对全部Bean,这样就可以利用生命周期来完成一些需要自定义的初始化和销毁Bean的行为。

原文地址:https://www.cnblogs.com/Demrystv/p/9256351.html

时间: 2024-10-24 10:32:01

Spring Bean的生命周期详解的相关文章

struts2.0中Action的对象生命周期详解!!(转)

原文出处:http://blog.csdn.net/wxy_g/article/details/2071662 有很多人问Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢? 这个和struts2.0中的配置有关,我们来看struts.properties ### if specified, the default object factory can be overridden here ### Note: short-hand notation is

ASP.NET生命周期详解 [转]

最近一直在学习ASP.NET MVC的生命周期,发现ASP.NET MVC是建立在ASP.NET Framework基础之上的,所以原来对于ASP.NET WebForm中的很多处理流程,如管道事件等,对于ASP.NET MVC同样适用.只是MVC URLRouting Module对进入到server的request进行了拦截,然后对此次request的handler进行了特殊的处理.总结来说,就是 ASP.NET管道是所有ASP.NET Web Applicaiton,包括WebForm,

Spring Bean的生命周期

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

IOS应用的执行过程以及生命周期详解

iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验. //开发app,我们要遵循apple公司的一些指导原则,原则如下: 1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到事件.在没

Spring Bean的生命周期(非常详细)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 转载请注明地址 http://www.cnblogs.com/zrtqsk/p/3735273.html,谢谢. 一.生命周期流程图: Spri

【转】spring bean的生命周期

spring bean生命周期在传统的Java应用中,Bean的生命周期非常简单. Java的关键词new用来实例化Bean(或许他是非序列化的).这样就够用了. 相反,Bean的生命周期在Spring容器中更加细致. 理解Spring Bean的生命周期非常重要,因为你或许要利用Spring提供的机会来订制Bean的创建过程. 1.容器寻找Bean的定义信息并且将其实例化. 2.受用依赖注入,Spring按照Bean定义信息配置Bean的所有属性. 3.如果Bean实现了BeanNameAwa

android四大基础组件--Service生命周期详解

android四大基础组件--ServiceService 生命周期详解 1.Service的生命周期: I> 在非绑定Service情况下,只有oncreate(),onStartCommand(),onDestory()方法情况下:  操作方法对应生命周期一: a.[执行startService(Intent)] 执行生命周期方法:oncreate()--->onStartCommand(): b.[执行stopService(Intent)] 执行生命周期方法:onDestory();

Spring Bean的生命周期(非常详细)(转载)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 转载请注明地址 http://www.cnblogs.com/zrtqsk/p/3735273.html,谢谢. 一.生命周期流程图: Spri

React—组件生命周期详解

React-组件生命周期详解 转自 明明的博客  http://blog.csdn.net/slandove/article/details/50748473 (非原创) 版权声明:转载请注明出处,欢迎加入QQ群(115402375)讨论!博客编写已经转移到http://blog.csdn.net/limm33 在组件的整个生命周期中,随着该组件的props或者state发生改变,它的DOM表现也将有相应的改变,一个组件就是一个状态机,对于特定的输入,它总会返回一致的输出. React为每个组件