Spring的Bean生命周期内的callback方法和Spring容器启动关闭时的callback方法
2010-04-14 15:37
288 查看
通过Spring管理的bean,在其生命周期内可以配置被Spring调用的callback方法一般有两种:通过实现Spring提供的特点接口和通过配置callback方法.(如果bean是prototype的话,由于其销毁不被Spring管理,其销毁方法不会被调用)
1,通过实现Spring提供的特点接口:通过实现InitializingBean接口,Spring容器会在初始化bean的时候调用该bean的afterPropertiesSet方法,通过实现DisposableBean接口,Spring容器会在销毁bean的时候调用该bean的destroy()方法.
例:
Spring还提供一种在最上层定义初始化和销毁方法,只要保持Bean的初始化和销毁方法按照一定的命名规范定义这些方法,就不需要为每一个bean单独指定初始化和销毁方法了.对于不存在这些方法的bean,Spring初始化这些bean的时候就忽略这种配置.
在Spring启动和关闭时被调用的callback方法:
例:
isRunning返回的值决定是否在Spring关闭的时候运行stop(Runnable arg0)方法,ture的话则运行.
getPhase返回的值决定启动的顺序,值越小越先启动,越后关闭,用于调整在有多个这样的bean的时候,这些bean之间启动的优先级.
*需要设置ctx.registerShutdownHook(),Spring容器关闭的时候才会调用stop方法.
AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("conf/lfCycleAppcontext.xml");
ctx.registerShutdownHook();
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();
相关文章推荐
- Spring的Bean生命周期内的callback方法和Spring容器启动关闭时的callback方法
- spring中bean的作用域与懒加载及初始化方法和销毁方法以及spring容器的正常关闭
- spring中bean的作用域与懒加载及初始化方法和销毁方法以及spring容器的正常关闭
- 随web容器启动Java类,调用spring容器中的的bean及其方法
- 随web容器启动Java类,调用spring容器中的的bean及其方法
- Spring--4.标签 生命周期 服务启动(bean管理xml)
- 7 -- Spring的基本用法 -- 9...容器中Bean的生命周期
- spring 在web容器启动时执行初始化方法
- Spring学习-- IOC 容器中 bean 的生命周期
- Spring容器中Bean的生命周期
- apacheFtpServer集成spring由web容器控制启动和关闭
- spring容器事件(启动,关闭,刷新...)
- 获取Spring容器中Bean实例的工具类(Java泛型方法实现)
- Spring容器中的Bean几种初始化方法和销毁方法的先后顺序
- 获取Spring 容器中bean的方法
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
- 普通Java类获取spring 容器的bean的5种方法
- spring容器bean实例化之后添加一些自己的逻辑处理(应用实例启动tomcat加载缓存)
- Spring-基于注解的配置[03Bean作用范围和生命周期方法]
- spring心得2--bean的生命周期@Spring监听器的作用@Spring初始化容器案例分析@web项目使用