Spring_07_init-method与destroy-method

需求

在创建bean对象后,调用一个初始化方法完成bean的初始化工作。

在Spring正常销毁前,调用一个结束/销毁方法做一些清理工作。

配置<bean>的init-method和destroy-method属性

· 默认情况下,在对应属性下,分别配置初始化方法名和结束方法名即可。

BeanObject

public class BeanObject implements IBeanObject {

    public BeanObject(){
        System.out.println("new BeanObject");
    }

    public void init(){
        System.out.println("beanObject init ...");
    }

    public void close(){
        System.out.println("beanObject close ...");
    }
}

配置文件

 <bean id="beanObject" class="com.hanaii.init_close.BeanObject"
          init-method="init" destroy-method="close"/>

测试代码

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class InitCloseTest {
   @Autowired
    private ApplicationContext ctx;

    @Test
    public void test(){
        BeanObject bean = ctx.getBean("beanObject", BeanObject.class);
    }
}

测试结果

 

· bean对象为原型模式时,Spring不会调用结束方法

配置文件

<bean id="beanObject" class="com.hanaii.init_close.BeanObject" scope="prototype"
    init-method="init" destroy-method="close"/>

测试结果

补充:bean对象为原型模式时,在手动启动时,即使正确关闭了容器,也不会调用结束方法。

· 手动启动容器时,必须要正常关闭Spring,Spring才能调用结束方法。

容器类型为:AbstractApplicationContext

通过调用容器对象的registerShutdownHook方法,在JVM的正常关闭线程中,添加一个Spring的关闭子线程。

只要JVM正常关闭,Spring就可正常关闭。

(可阅读该方法源代码,了解守护进程。)

测试代码

public class InitCloseTest {

    @Test
    public void test(){
        AbstractApplicationContext ctx = new ClassPathXmlApplicationContext
                ("com/hanaii/init_close/InitCloseTest-context.xml");
        BeanObject bean = ctx.getBean("beanObject", BeanObject.class);
        ctx.registerShutdownHook();
    }
}

测试结果

猜你喜欢

转载自blog.csdn.net/hanaii/article/details/82498409