Spring调用初始化与销毁方法的几种实现

2020-02-19 10:52
1099
0
Spring对象的初始化这里就不细讲了,后面在源码分析中讲解。
首先简单说一下Spring会在何时调用对象初始化和销毁方法。
1、对象的初始化
spring在对bean初始化时会先把其对象创建完成、然后对其参数进行赋值、最后会调用初始化方法。在调用初始化方法之前还会先判断此对象是否实现了后置处理器。
2、对象销毁
单实例:容器关闭的时候
多实例:容器不会管理这个bean;容器不会调用销毁方法;
Bean的创建(执行构造函数)-》初始化(自定义init方法)-》销毁
什么时候调用销毁方法?在applicationContext调用close方法时会去执行bean的销毁方法。
3、实现方式
方法一、通过@Bean指定init-method和destory-method
方法二、通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)
方法三、Spring还支持基于JSR-250的注解:
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作。

怎么在初始化方法前后执行一些逻辑,这就要用到后置处理器,想了想这些都留到后面的文章中再做详解,卖个关子。
 
3.1、方法一示例
package com.cyx.initdemo;

import org.springframework.context.annotation.*;

@Configuration
public class MyInitConfig {

    @Bean(initMethod = "initMethod",destroyMethod = "destroyMethod")
    public MyEntity myEntity(){
        return new MyEntity ();
    }
}
class MyEntity {
    public MyEntity(){
        System.out.println("执行了MyEntity无参构造函数》》》》》》");
    }
    private void initMethod(){
        System.out.println("执行了init方法》》》》》》》》》》》》");
    }
    private void destroyMethod(){
        System.out.println("执行了 destroy方法》》》》》》》》》》》》》");
    }
}

测试代码如下:

package com.cyx.initdemo;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestInit {

    public static void main (String[] args){
        //以注解的方式执行
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyInitConfig.class);
        //获取对象
        MyEntity myEntity = context.getBean("myEntity", MyEntity.class);
        System.out.println(myEntity.toString());
        //再次调用
        MyEntity myEntity2 = context.getBean("myEntity", MyEntity.class);
        System.out.println(myEntity2.toString());
        //销毁
        context.close();

    }
}

执行结果:

3.2、方法二示例
package com.cyx.initdemo;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.*;

@Configuration
public class MyInitConfig {
    @Bean
    public MyEntity myEntity(){
        return new MyEntity ();
    }
}
class MyEntity implements InitializingBean, DisposableBean {
    public MyEntity(){
        System.out.println("执行了MyEntity无参构造函数》》》》》》");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("执行了init方法》》》》》》》》》》》》");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("执行了 destroy方法》》》》》》》》》》》》》");
    }
}

同样的测试类,执行结果如下:

3.3、方法三示例
package com.cyx.initdemo;

import org.springframework.context.annotation.*;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Configuration
public class MyInitConfig {
    @Bean
    public MyEntity myEntity(){
        return new MyEntity ();
    }
}
class MyEntity{
    public MyEntity(){
        System.out.println("执行了MyEntity无参构造函数》》》》》》");
    }
    @PostConstruct
    public void afterPropertiesSet() throws Exception {
        System.out.println("执行了init方法》》》》》》》》》》》》");
    }
    @PreDestroy
    public void destroy() throws Exception {
        System.out.println("执行了 destroy方法》》》》》》》》》》》》》");
    }
}

测试结果相同:

全部评论