您的位置:首页 > 编程语言 > Java开发

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

2014-11-05 00:00 459 查看
通过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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐