文档章节

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();


© 著作权归作者所有

共有 人打赏支持
明舞
粉丝 228
博文 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
spring4.0之二:@Configuration的使用

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfi...

文文1
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

RabbitMQ在CentOS环境安装

1.废话不多说准备一台虚拟机,系统为centos,我这里使用的系统版本如下图所示:

凌晨一点
45分钟前
0
0
线程池相关

在java.util.concurrent包下,提供了一系列与线程池相关的类。 使用线程池的好处 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗; 提高响应速度。当任务到达时,任务...

edwardGe
47分钟前
0
0
学习大数据这三个关键技术是一定要掌握!

大数据时代全面来临,大数据、人工智能等技术引领科技创新潮流,获得国家政策大力支持,前景广阔。学习大数据技术的人自然是络绎不绝, 学习大数据虽然是一个趋势,但也要注意大数据培训课程...

董黎明
今天
0
0
jetbrains 上传代码到github

设置中找github 获取token 验证是否成功 测试git 生成key,一路回车即可 ssh-keygen -t rsa -C “youremail@example.com” 打开pub复制key,需要再次输入一次密码 验证是否成功,输入yes即可...

阿豪boy
今天
0
0
分布式服务框架(拾遗)

前言 现在的大部分工程都已经是基于分布式架构来处理。所以这里对分布式框架做一个简单的总结 常用的RPC框架 RPC框架原理 RPC(Remote Procedure Call,远程过程调用)一般用来实现部署在不同...

kukudeku
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部