SpringのBeanライフサイクル内のcalback方法とSpring容器起動閉鎖時のcalback方法


Springで管理されているbeanは、Springで呼び出されたcalbackをライフサイクル内に配置することができます.Springで提供される特徴インターフェースを実現することと、calbackを配置することによって、2つの方法があります.
1,Spring提供の特徴インターフェースを実現することにより,InitializingBeanインターフェースを実現することにより,Spring容器はbeanを初期化する際に,beanのafterPropertiesset方法を呼び出すことができ,Dispsable Benインターフェースを実現することにより,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、プロファイルを介してcalback方法を指定します.
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に独立しています.InitializingBenを実現しながらinit-methodを指定します.Initializing BeafterPropertiesset方法はinit-methodで指定する前に呼び出します.
Springはまた、最上位層に初期化と廃棄方法を定義し、ビーンの初期化と廃棄方法を一定の命名規範に基づいて定義する限り、これらの方法を個々に初期化と廃棄方法を指定する必要はない.これらの方法が存在しないbeanに対して、Springはこれらのbeanを初期化する際にはこのような構成を無視する.
<beans default-init-method="init" default-destroy-method="cleanUp">

    <bean ....>

</beans>

Spring容器の起動とクローズ時に、beanのcalbackを配置する方法は、通常はバックグラウンドプログラムを設定するために用いられ、起動後はずっと(MQをポーリングするなど)しています.Springが提供するインターフェースを実現することにより、Lifecycle、phasedまたはSmartLifecycleを実現します.
Spring起動時とクローズ時に呼び出すコールバック方法:
例:
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" />
isAutoStartpの戻り値はSpring起動時にstart方法を実行するかどうかを決定し、tureは実行します.
isRunningの戻り値はSpringがオフになった時にstop(Runnable arg 0)メソッドを実行するかどうかを決定し、tureは実行します.
get Phiteの戻り値は起動の順序を決定し、値が小さいほど先に起動し、後に閉じるほど、このようなbeanが複数あるときにこれらのbean間で起動する優先度を調整するために使用される.
*ctx.register Shutdown Hook()を設定して、Spring容器が閉まる時にstop方法を呼び出します.
        AbstractAplication Contect ctx=new Class PathXml Apple Controtext(「conf/lfCycleAppcontext.xml」);    
        ctx.register Shutdown Hook()