文档章节

Spring的Bean生命周期内的callback方法和Spring容器启动关闭时的callback方法

明舞
 明舞
发布于 2014/11/05 13:57
字数 734
阅读 48
收藏 0

通过Spring管理的bean,在其生命周期内可以配置被Spring调用的callback方法一般有两种:通过实现Spring提供的特点接口和通过配置callback方法.(如果bean是prototype的话,由于其销毁不被Spring管理,其销毁方法不会被调用)

1,通过实现Spring提供的特点接口:通过实现InitializingBean接口,Spring容器会在初始化bean的时候调用该bean的afterPropertiesSet方法,通过实现DisposableBean接口,Spring容器会在销毁bean的时候调用该bean的destroy()方法.

例:

public class InitDisposeBean implements InitializingBean,DisposableBean {
    protected static final Log log = LogFactory.getLog(InitDisposeBean.class);
    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("afterPropertiesSet");
       
    }
    @Override
    public void destroy() throws Exception {
        log.info("destroy");       
    }
    public void test() {
        log.info("test");       
    }
}

<bean id="InitDisposeBean" class="com.test.spring.lifecycle.InitDisposeBean" />
2,通过配置文件指定callback方法:
public class InitDisposeCfgBean {
    protected static final Log log = LogFactory.getLog(InitDisposeCfgBean.class);
    public void init()  {
        log.info("init"); 
    } 
    public void cleanup() {
        log.info("cleanup");       
    } 
    public void test() {
        log.info("test");       
    }
}

<bean id="InitDisposeCfgBean" class="com.test.spring.lifecycle.InitDisposeCfgBean" init-method="init" destroy-method="cleanup"/>
通常推荐使用第二种方法,这种做法更符合IoC的思想,并且不实现Spring的接口,代码独立于Spring.如果实现InitializingBean的同时指定init-method,InitializingBean的afterPropertiesSet方法会在init-method指定的方法之前调用.(没有理由同时这么做...)

Spring还提供一种在最上层定义初始化和销毁方法,只要保持Bean的初始化和销毁方法按照一定的命名规范定义这些方法,就不需要为每一个bean单独指定初始化和销毁方法了.对于不存在这些方法的bean,Spring初始化这些bean的时候就忽略这种配置.

<beans default-init-method="init" default-destroy-method="cleanUp">

    <bean ....>

</beans>
Spring容器启动和关闭的时候,配置对bean的callback方法通常用来配置后台程序,在启动后一直运行(如对MQ进行轮询等等),通过实现Spring提供的接口:Lifecycle,phased或者SmartLifecycle来实现(其中SmartLifecycle继承了Lifecycle和phased).

在Spring启动和关闭时被调用的callback方法:

例:

public class LfCycleBean1 implements SmartLifecycle{
    protected static final Log log = LogFactory.getLog(LfCycleBean1.class);
    private boolean isRunning = false;
    @Override
    public boolean isAutoStartup() {
        // TODO Auto-generated method stub
        return true;
    }

    @Override
    public void stop(Runnable arg0) {
        arg0.run();
        isRunning = false;
        log.info("stop Runnable");   
    }

    @Override
    public boolean isRunning() {
        // TODO Auto-generated method stub
        return isRunning;
    }
    @Override
    public void start() {
        isRunning = true;
        log.info("start ");    
    }
    @Override
    public void stop() {
        isRunning = false;
        log.info("stop");   
    }
    @Override
    public int getPhase() {      
        return -1;
    }
}

<bean id="LfCycleBean1" class="com.test.spring.lifecycle.LfCycleBean1" />
isAutoStartup返回的值决定是否在Spring启动的时候运行start方法,ture的话则运行.
isRunning返回的值决定是否在Spring关闭的时候运行stop(Runnable arg0)方法,ture的话则运行.
getPhase返回的值决定启动的顺序,值越小越先启动,越后关闭,用于调整在有多个这样的bean的时候,这些bean之间启动的优先级.
*需要设置ctx.registerShutdownHook(),Spring容器关闭的时候才会调用stop方法.
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("conf/lfCycleAppcontext.xml");    
        ctx.registerShutdownHook();


© 著作权归作者所有

共有 人打赏支持
明舞
粉丝 229
博文 424
码字总数 516555
作品 0
程序员
Spring的Bean生命周期内的callback方法和Spring容器启动关闭时的callback方法

通过Spring管理的bean,在其生命周期内可以配置被Spring调用的callback方法一般有两种:通过实现Spring提供的特点接口和通过配置callback方法.(如果bean是prototype的话,由于其销毁不被Spring管...

晨曦之光
2012/04/25
1K
1
Spring框架参考手册_5.0.0_中英文对照版_Part II_3.6

3.6 Customizing the nature of a bean 3.6.1 Lifecycle callbacks To interact with the container’s management of the bean lifecycle, you can implement the Spring and interfaces. ......

Quincuntial
2016/10/17
0
0
Spring中关于bean的作用域与生命周期

在Spring中,那些组成应用程序的主体及由Spring IoC容器所管理的对象,被称之为bean。简单地讲,bean就是由IoC容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什...

忻胜霄
06/07
0
0
Spring中ApplicationContext的事件机制

ApplicationContext事件机制是观察者设计模式的实现,通过ApplicationEvent类和ApplicationListener接口,可以实现ApplicationContext事件处理。如果容器中有一个ApplicationListener Bean,...

摆渡者
2014/02/27
0
0
Spring中管理Bean依赖注入之后和Bean销毁之前的行为

对于Singleton作用域的Bean,Spring容器将会跟踪它们的生命周期,容器知道何时实例化结束、何时销毁。Spring可以管理Bean在实例化结束之后和Bean销毁之前的行为。 Bean依赖关系注入之后的行为...

摆渡者
2014/03/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python深体验,常见的数据处理方式(必须要懂的)

1.缺失值处理 - 拉格朗日插值法 input_file数据文件内容(存在部分缺失值): from scipy.interpolate import lagrangeimport pandas as pdimport numpy as npinput_file = './dat...

无也Python
23分钟前
2
0
Spring MVC注解故障追踪记

Spring MVC是美团点评很多团队使用的Web框架。在基于Spring MVC的项目里,注解的使用几乎遍布在项目中的各个模块,有Java提供的注解,如:@Override、@Deprecated等;也有Spring提供的注解,...

Skqing
25分钟前
4
0
区块链入门教程以太坊源码分析cmd包分析

  兄弟连区块链入门教程以太坊源码分析cmd包分析。 ### cmd包概述 * geth 主要Ethereum CLI客户端。它是Ethereum网络(eth主网,测试网络或私有网)的入口点,使用此命令可以使节点作为ful...

兄弟连区块链入门教程
26分钟前
1
0
@Autowired 报红线

代码可正常跑,不过红线看着有点难受,解决方案 使用@Autowired(required=false) 或者@Resource. 这两者区别网上一大堆

斩神魂
32分钟前
1
0
DataTable中检索信息 (C#)

C#_从DataTable中检索信息 存在于内存中的虚拟表DataTable,绑定在数据显示控件后,如果想在再检索其中某些信息,可以利用DataTable.Select方法进行检索,避免了重复的读取数据库。Select方法...

CS-CS01
40分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部