Day2 bean生命周期

bean生命周期函数

我们可以给bean定义初始化函数和销毁函数,Spring在启动和关闭时会自动调用它们。

基于xml

用法:

    <bean id="connector" class="com.bailiban.day2.lifecycle.MyConnector"
          init-method="init" destroy-method="destroy" />
  • init-method:设置初始化方法;
  • destroy-method:设置销毁方法;

示例:

/**
 * xml配置:
 *  init-method="init" destroy-method="destroy"
 */
public class MyConnector {

    public MyConnector() {
        System.out.println("MyConnector: 调用构造函数...");
    }

    public void init() {
        System.out.println("MyConnector: 调用初始化函数,创建连接...");
    }

    public Object getConnection() {
        System.out.println("获取连接...");
        return null;
    }

    public void destroy() {
        System.out.println("MyConnector: 调用销毁函,关闭连接,清除资源...");
    }
}

测试:

    /**
     * 在xml文件中配置初始化和销毁方法
     *  init-method="init" destroy-method="destroy"
     */
    static void xmlTest() {
        // 在初始化Spring容器的时候,会创建MyConnector类
        // 并调用其构造函数和初始化函数
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "com/bailiban/day2/lifecycle/lifecycle.xml");

        // 获取MyConnector对象,并调用相关方法。
        // 注意:MyConnector对象不是在getBean方法中创建的,而是在Spring初始化时已被创建
        context.getBean(MyConnector.class).getConnection();

        // 关闭Spring容器,bean的销毁方法会被执行
        context.close();
    }

运行结果:

MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...

基于接口

用法:

/**
 * 通过实现InitializingBean接口,创建初始化烦方法
 * 实现DisposableBean接口,创建销毁方法
 */
public class MyConnector2 implements InitializingBean, DisposableBean {

    public MyConnector2() {
        System.out.println("MyConnector: 调用构造函数...");
    }

    public Object getConnection() {
        System.out.println("获取连接...");
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("MyConnector: 调用销毁函,关闭连接,清除资源...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("MyConnector: 调用初始化函数,创建连接...");
    }
}

  • 继承InitializingBean接口:通过重写afterPropertiesSet方法,设置初始化方法;
  • 继承DisposableBean接口:通过重写destroy方法,设置销毁方法;

测试:

    /**
     * 通过实现InitializingBean接口,创建初始化方法
     * 实现DisposableBean接口,创建销毁方法
     */
    static void interfaceTest() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "com/bailiban/day2/lifecycle/lifecycle.xml");
        context.getBean(MyConnector2.class).getConnection();
        context.close();
    }

运行结果:

MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...

基于注解

用法:

/**
 * 基于注解的初始化方法和销毁方法
 */
@Component
public class MyConnector3 {

    public MyConnector3() {
        System.out.println("MyConnector: 调用构造函数...");
    }

    public Object getConnection() {
        System.out.println("获取连接...");
        return null;
    }

    @PreDestroy
    public void destroy() {
        System.out.println("MyConnector: 调用销毁函,关闭连接,清除资源...");
    }

    @PostConstruct
    public void init() throws Exception {
        System.out.println("MyConnector: 调用初始化函数,创建连接...");
    }
}
  • @PostConstruct:设置初始化方法;
  • @PreDestroy:设置销毁方法;

xml配置:

<context:component-scan base-package="com.bailiban.day2.lifecycle" />

如果提示找不到@PostConstruct,则需要在pom.xml中添加依赖:

		<dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>

测试:

	/**
     * 基于注解的初始化方法和销毁方法
     */
    static void annotationTest() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "com/bailiban/day2/lifecycle/lifecycle.xml");
        context.getBean(MyConnector3.class).getConnection();
        context.close();
    }

运行结果:

MyConnector: 调用构造函数...
MyConnector: 调用初始化函数,创建连接...
获取连接...
MyConnector: 调用销毁函,关闭连接,清除资源...
posted @ 2019-12-18 22:46  cheng_18  阅读(232)  评论(0编辑  收藏  举报