文档章节

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

明舞
 明舞
发布于 2014/11/05 13:57
字数 734
阅读 54
收藏 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();


© 著作权归作者所有

共有 人打赏支持
明舞
粉丝 227
博文 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 Container的扩展点

Spring在解析完配置文件后,会调用一些callback方法,使用Spring的开发者可以通过提供这些callback方法达到对Spring Container的扩展. 1,通过实现BeanPostProcessor来完成对某些Bean的一些'定制...

晨曦之光
2012/04/25
440
0
Spring中关于bean的作用域与生命周期

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

忻胜霄
2018/06/07
0
0
Spring Bean生命周期-阶段汇总,面试必备(十二)

以后面试问到Bean的生命周期再也不怕了! 看了这么久的Spring源码,想必对Spring的生命周期已经有了一定的了解,这次将之前零散的生命周期处理的事情贯穿起来,看过之后,一定对bean的生命周...

Real_man
2018/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
6
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
3
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
2
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
0
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部