spring bean初始化和销毁方法

来源:互联网 发布:小米平板网络助手 编辑:程序博客网 时间:2024/06/06 01:15

在spring中一个bean生命周期大概如下 :
- 定义 : 在xml中定义
- 初始化 : 容器初始化的时候初始化bean
- 使用 : 程序从容器中取出来用
- 销毁 : 容器销毁的时候

bean 的完整生命周期是要复杂得多的,后边搞懂了专门来写这个。这里记录怎么定义bean的初始化和销毁方法。实现方法有三种:实现接口、xml配置和注解。
现在有一个BeanTest 类(没有初始化销毁方法) :

package com.spring.beans;public class BeanTest {    public void method()    {        System.out.print("bean 方法执行");    }}

配置xml :

<?xml version="1.0" encoding="UTF-8"?><!--spring 配置文件  --><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">    <bean id="beanTest" class="com.spring.beans.BeanTest"></bean></beans>

测试类 :

package com.spring.test;import com.spring.beans.BeanTest;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {    @Test    public void Test() {        ClassPathXmlApplicationContext context =        new ClassPathXmlApplicationContext("applicationContext.xml");        BeanTest test = (BeanTest) context.getBean("beanTest");        test.method();        context.close();    }}

测试输出结果 :

bean 方法执行

下面配置初始化销毁方法 :

实现接口的方式

实现InitializingBean(初始化)、DisposableBean(销毁)接口

package com.spring.beans;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;public class BeanTest implements InitializingBean ,DisposableBean{    @Override    public void afterPropertiesSet() throws Exception {        System.out.println("bean 初始化");    }    @Override    public void destroy() throws Exception {        System.out.println("bean 销毁");    }    public void method()    {        System.out.println("bean 方法执行");    }}

测试结果 :

bean 初始化bean 方法执行bean 销毁

xml配置的方式

每个bean单独配置初始化销毁方法

将BeanTest修改如下 :

package com.spring.beans;public class BeanTest {    public  void init()    {        System.out.println("bean 初始化");    }    public void destroy()    {        System.out.println("bean 销毁");    }    public void method()    {        System.out.println("bean 方法执行");    }}

修改xml :

    <bean id="beanTest" class="com.spring.beans.BeanTest"             init-method="init" destroy-method="destroy"/>

测试 :

bean 初始化bean 方法执行bean 销毁

配置全局的初始化销毁方法

<?xml version="1.0" encoding="UTF-8"?><!--spring 配置文件  --><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"        default-init-method="init" default-destroy-method="destroy">         <!--配置全局初始化销毁方法-->    <bean id="beanTest" class="com.spring.beans.BeanTest" />    </beans>

测试输出 :

bean 初始化bean 方法执行bean 销毁

注解配置初始化和销毁方法

使用注解实现bean的初始化和销毁方法,需要导入aop的jar包:导入之后的包有 :
- spring-beans-4.0.5.RELEASE.jar
- spring-aop-4.0.5.RELEASE.jar
- spring-context-4.0.5.RELEASE.jar
- spring-core-4.0.5.RELEASE.jar
- spring-expression-4.0.5.RELEASE.jar
- commons-logging-1.0.4.jar
- junit-4.10.jar

需要修改xml文件,使工程支持注解

<?xml version="1.0" encoding="UTF-8"?><!--增加了context --><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context        http://www.springframework.org/schema/context/spring-context.xsd">    <!--支持注解的包-->    <context:component-scan base-package="com.spring.beans"/>    <bean id="beanTest" class="com.spring.beans.BeanTest" />    </beans>

使用注解修改BeanTest :

package com.spring.beans;import javax.annotation.PostConstruct;import javax.annotation.PreDestroy;public class BeanTest {    //初始化方法    @PostConstruct    public  void init()    {        System.out.println("bean 初始化");    }    //销毁方法    @PreDestroy    public void destroy()    {        System.out.println("bean 销毁");    }    public void method()    {        System.out.println("bean 方法执行");    }}

测试结果 :

bean 初始化bean 方法执行bean 销毁

几种方式的比较

优先级

为了测试这几种方式的优先级,我将所有的方式全部用上(标注不同方法),得到的输出如下 :

注解初始化接口初始化xml初始化bean 方法执行注解销毁接口销毁xml销毁

全局默认的初始化销毁没有执行。可以得出以下结论:
1.全局初始化销毁方法在有其他方式的情况下是不起作用的
2.优先级 : 注解 > 接口 > xml 单个配置 > 全局xml配置

耦合

出于解耦的考虑,不推荐接口的方式。

0 0