Spring应用上下文中Bean的生命周期

Bean装载到Spring应用上下文的生命周期,如图:

Bean在Spring容器中从创建到销毁经历了若干个阶段,每一阶段都可以对Spring如何管理Bean进行个性化定制,以下我们通过代码去验证生命周期以及个性化定制方法;

BeanLife实现Aware接口、InitializingBean、DisposableBean接口,自定义生命周期中的方法。

/**
 * @name Bean生命周期
 */
public class BeanLife implements BeanNameAware,BeanFactoryAware,ApplicationContextAware,InitializingBean,DisposableBean{

    private String beanProperty;//私有属性

    private String beanName; //接收BeanNameAware的beanName传入
    private BeanFactory beanFactory;//接收BeanFactoryAware的beanFactory传入
    private ApplicationContext applicationContext;//接收ApplicationContextAware的applicationContext传入

    /**
     * 构造函数
     */
    public BeanLife(String beanProperty){
        System.out.println("BeanLife constructed with "+beanProperty+"......");
    }

    /**
     * bean属性get
     */
    public String getBeanProperty() {
        return beanProperty;
    }

    /**
     * bean填充属性
     */
    public void setBeanProperty(String beanProperty) {
        System.out.println("BeanLife setBeanProperty:"+beanProperty);
        this.beanProperty = beanProperty;
    }

    /**
     * init-method关联方法
     */
    public void begin(){
        System.out.println("init-method:begin()");
    }
    /**
     * destroy-method关联方法
     */
    public void end(){
        System.out.println("destroy-method:end()");
    }

    /**
     * 准备就绪的bean,使用Bean做些事情
     */
    public void doSomething(){
        System.out.println("BeanLife can be used: do something.");
    }

    /**
     * Spring将BeanFactory容器实例传入
     */
    public void setBeanFactory(BeanFactory arg0) throws BeansException {
        this.beanFactory=arg0;
        System.out.println("BeanFactoryAware---BeanLife setBeanFactory:"+this.beanFactory.toString());
    }

    /**
     * Spring将Bean的ID传入
     */
    public void setBeanName(String arg0) {
        this.beanName = arg0;
        System.out.println("BeanNameAware---BeanLife setBeanName:"+this.beanName);
    }

    /**
     * Spring将应用上下文的引用传入
     */
    public void setApplicationContext(ApplicationContext arg0)
            throws BeansException {
        this.applicationContext = arg0;
        System.out.println("ApplicationContextAware---BeanLife setApplicationContext:"+this.applicationContext.getApplicationName());
    }

    /**
     * 属性设置完毕后
     */
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean---After SetProperties");
    }
    /**
     * Bean销毁
     */
    public void destroy() throws Exception {
        System.out.println("DisposableBean---BeanLife Bean destroy.");
    }
}

自定义一个BeanPostProcessor进行监控Spring容器Bean实例化注入时的回调方法定制

/**
 * @name BeanPostProcessor实现
 */
public class BeanLifePostProcessor implements BeanPostProcessor{

    /**
     * 实例化、依赖注入完毕,在调用显示的初始化之前完成一些定制的初始化任务
     * @param arg0 Bean对象
     * @param arg1 Bean的ID
     */
    public Object postProcessBeforeInitialization(Object arg0, String arg1)
            throws BeansException {
        System.out.println("BeanPostProcessor---Before "+arg1+"‘s Initialization ");
        return arg0;
    }

    /**
     * 实例化、依赖注入、初始化完毕时执行
     * @param arg0 Bean对象
     * @param arg1 Bean的ID
     */
    public Object postProcessAfterInitialization(Object arg0, String arg1)
            throws BeansException {

        System.out.println("BeanPostProcessor---After "+arg1+"‘s Initialization");
        return arg0;
    }

}

applicationContext.xml配置

<!-- BeanLife -->
<bean id="beanlife" class="com.wjx.betalot.BeanLife" init-method="begin" destroy-method="end">
    <constructor-arg value="beanlife construct param"></constructor-arg>
    <property name="beanProperty" value="beanlife cycle"></property>
</bean>
<!-- beanPostProcessor -->
<bean id="beanPostProcessor" class="com.wjx.betalot.BeanLifePostProcessor"></bean>

验证测试:

public static void main( String[] args ) throws Exception{

        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        BeanLife beanlife = (BeanLife) context.getBean("beanlife");
        beanlife.doSomething();
        //销毁bean
        ((ClassPathXmlApplicationContext)context).registerShutdownHook();
}

测试结果:

BeanLife constructed with beanlife construct param......
BeanLife setBeanProperty:beanlife cycle
BeanNameAware---BeanLife setBeanName:beanlife
BeanFactoryAware---BeanLife setBeanFactory:org.s[email protected]5eed2fce: defining beans [beanlife,beanPostProcessor]; root of factory hierarchy
ApplicationContextAware---BeanLife setApplicationContext:
BeanPostProcessor---Before beanlife‘s Initialization
InitializingBean---After SetProperties
init-method:begin()
BeanPostProcessor---After beanlife‘s Initialization
BeanLife can be used: do something.
DisposableBean---BeanLife Bean destroy.
destroy-method:end()

可对照Bean的生命周期图,进行验证。

时间: 2024-07-29 14:18:24

Spring应用上下文中Bean的生命周期的相关文章

8、spring注解学习(bean的生命周期)——让Bean实现InitializingBean,DisposableBean这两个接口进而实现初始和销毁方法

1.创建Tiger类实现InitializingBean,DisposableBean接口,并通过@Component将该组件注入 @Component public class Tiger implements InitializingBean,DisposableBean{ public Tiger() { System.out.println("Tiger的构造方法执行了..."); } /** * 此方法就是在调用构造方法之后属性都赋完值就执行 */ @Override pub

MyEclipse Spring 学习总结二 Bean的生命周期

文件结构可以参考上一节 Bean的生命周期有方法有:init-method,destroy-method ApplicationContext.xml 文件配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/

spring IOC 容器中 Bean 的生命周期

IOC 容器中 Bean 的生命周期: 1.通过构造器或工厂方法创建 Bean 实例2.为 Bean 的属性设置值和对其他 Bean 的引用3.调用 Bean 后置处理器接口(BeanPostProcessor),进行初始化前处理4.调用 Bean 的初始化方法5.调用 Bean 后置处理器接口(BeanPostProcessor),进行初始化后处理6.Bean 可以使用了7.当容器关闭时, 调用 Bean 的销毁方法8.在 Bean 的声明里设置 init-method 和 destroy-m

详解spring——IOC之分析Bean的生命周期

https://www.jianshu.com/p/f968bf1a1892 在分析 Spring Bean 实例化过程中提到 Spring 并不是一启动容器就开启 bean 的实例化进程,只有当客户端通过显示或者隐式的方式调用 BeanFactory 的 getBean() 方法来请求某个实例对象的时候,它才会触发相应 bean 的实例化进程,当然也可以选择直接使用 ApplicationContext 容器,因为该容器启动的时候会立刻调用注册到该容器所有 bean 定义的实例化方法.当然对于

Spring《二》 Bean的生命周期

Bean初始化 1.bean中实现public void init():方法,config.xml中增加init-method="init" 属性. 2.bean实现接口InitializingBean,实现方法afterPropertiesSet,配置文件无需改动. Bean的使用 1. HelloWorld helloWorld=new HelloWorld(); BeanWrapper bw=new BeanWrapperImpl(helloWorld); bw.setPrope

Spring学习笔记3 - Bean的生命周期

当一个bean被实例化时,它可能需要执行一些初始化使它转换成可用状态. 当bean不再需要,并且从容器中移除是,可能需要做一些清除工作. 为了定义安装和拆卸一个bean,我们只要声明带有init-method和/或destroy-method参数 init-method属性指定一个方法,在实例化bean时,立即调用该方法. destroy-method指定一个方法,只有从容器中移除bean之后,才能调用该方法. 示例: beans.xml <?xml version="1.0"

Spring Bean的生命周期,《Spring 实战》书中的官方说法

连着两天的面试 ,都问到了 Spring 的Bean的生命周期,其中还包括 昨晚一波阿里的电话面试.这里找到了Spring 实战中的官方说法.希望各位要面试的小伙伴记住,以后有可能,或者是有时间 去看看源码最好(也包括我自己).哈哈 Bean 的生命周期 在传统的Java应用中,bean的生命周期很简单.使用Java 关键字 new 进行bean 实例化,然后该 bean 就可以使用了.一旦该bean 不再被使用,则由 java 自动进行垃圾回收. 相比之下,Spring 容器中的 bean 的

Spring的Bean的生命周期以及Bean的后置处理器

Bean的生命周期: Spring IOC 容器可以管理 Bean 的生命周期, Spring 允许在 Bean 生命周期的特定点执行定制的任务. Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1通过构造器或工厂方法创建 Bean 实例 2为 Bean 的属性设置值和对其他 Bean 的引用 3调用 Bean 的初始化方法(可以人为指定,利用Bean标签的inti-method属性指定初始化方法,不指定就默认忽略这步骤) Bean 可以使用了 4当容器关闭时, 调用 Bea

IOC容器中bean的生命周期

一.Bean生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: 通过构造器或工厂方法创建Bean实例 为Bean的属性设置值和对其它Bean的引用 调用Bean的初始化方法 Bean可以使用了 当容器关闭时,调用Bean的销毁方法 在 Bean 的声明里设置 init-method 和 destroy-method 属性, 为 Bean 指定初始化和销毁方法. 下面通过示例