Day2 bean life cycle

bean lifecycle methods

We can define a bean initialization function and destructor, Spring will automatically call them at startup and shutdown.

xml-based

usage:

    <bean id="connector" class="com.bailiban.day2.lifecycle.MyConnector"
          init-method="init" destroy-method="destroy" />
  • init-method: method of setting initialization;
  • destroy-method: setting destruction method;

Example:

/**
 * 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: 调用销毁函,关闭连接,清除资源...");
    }
}

test:

    /**
     * 在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();
    }

operation result:

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

Based Interface

usage:

/**
 * 通过实现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: 调用初始化函数,创建连接...");
    }
}
  • Interface inheritance InitializingBean: afterPropertiesSet by rewriting method, a method is provided to initialize;
  • Inheritance DisposableBean Interface: by overriding the destroy method, set the method of destruction;

test:

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

operation result:

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

Based on notes

usage:

/**
 * 基于注解的初始化方法和销毁方法
 */
@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: setting an initialization method;
  • @PreDestroy: Setting destruction method;

xml configuration:

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

If not able to find @PostConstruct, you need to add a dependency in pom.xml:

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

test:

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

operation result:

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

Guess you like

Origin www.cnblogs.com/cheng18/p/12064425.html