文档章节

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

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

没有更多内容

加载失败,请刷新页面

加载更多

linux上解压版安装jdk,tomcat

需要的安装包 1.vmware12 2.centos7版本 3.安装完成后需要xshell来连接远程虚拟机,虚拟机保证要联网,网络畅通。 4.xftp用来向linux传输文件用,一般来说xshell和xftp配套使用 5.对应的压缩...

architect刘源源
36分钟前
23
0
Jenkins的配置

1 修改jenkins的根目录,默认地在C:\Documents and Settings\AAA\.jenkins 。 .jenkins ├─jobs │ └─JavaHelloWorld │ ├─builds │ │ ├─2011-11-03_16-48-17 │ │ ├─2011-11-0......

shzwork
今天
3
0
使用 spring 的 IOC 解决程序耦合

工厂模式解耦 在实际开发中我们可以把三层的对象都使用配置文件配置起来,当启动服务器应用加载的时候,让一个类中的方法通过读取配置文件,把这些对象创建出来并存起来。在接下来的使用的时...

骚年锦时
今天
2
0
group by分组后获得每组中时间最大的那条记录

用途: GROUP BY 语句用于 对一个或多个列对结果集进行分组。 例子: 原表: 现在,我们希望根据USER_ID 字段进行分组,那么,可使用 GROUP BY 语句。 我们使用下列 SQL 语句: SELECT ID,US...

豆花饭烧土豆
今天
3
0
android6.0源码分析之Camera API2.0下的Preview(预览)流程分析

本文将基于android6.0的源码,对Camera API2.0下Camera的preview的流程进行分析。在文章android6.0源码分析之Camera API2.0下的初始化流程分析中,已经对Camera2内置应用的Open即初始化流程进...

天王盖地虎626
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部