Spring注解学习_生命周期1_初始化和销毁方法

Bean的生命周期:

​ bean创建、初始化、销毁

容器管理bean的生命周期:

​ 我们可以自定义初始化和销毁方法:容器在bean进行到对应生命周期时调用我们自定义的初始化和销毁方法

构造(bean对象创建):

  • 单实例:在容器启动时创建对象
  • 多实例:在每次获取时创建对象

初始化:

  • 对象创建好,并赋值好后,调用初始化方法

销毁:

  • 单实例:容器关闭的时候
  • 多实例:容器不会管理这个bean,容器不会去调用销毁方法,需自行手动调用

两种初始化和销毁的方式

一、@Bean注解中指定初始化和销毁方法

即指定init-method和destroy-method。若想指定初始化和销毁方法,在用@Bean注解去注册Bean时,需要标明该bean的initMethod和destroyMethod。

新建Bean对象:Car

public class Car {
    public Car(){
        System.out.println("car constructor...");
    }
    public void init(){
        System.out.println("car init");
    }
    public void destroy(){
        System.out.println("destroy...");
    }
}

新建配置类:MainConfig3,注册bean,指定其初始化和销毁方法

@Configuration
public class MainConfig3 {
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }
}

新建测试类:

public class IOCTest_LifeCycle {
    @Test
    public void test1(){
        AnnotationConfigApplicationContext context = 
            new AnnotationConfigApplicationContext(MainConfig3.class);
        System.out.println("容器创建完成");
        context.close();	//关闭容器时才会调用销毁方法
    }
}

执行结果:

image-20200330005636589

二、让Bean去实现InitializingBean接口和DisposableBean接口

InitializingBean:实现afterPropertiesSet()方法,定义初始化逻辑
DisposableBean:实现destroy()方法,定义销毁逻辑

新建Bean对象:Cat,实现InitializingBean,DisposibleBean

public class Cat implements InitializingBean, DisposableBean {
    public Cat(){
        System.out.println("cat constructor...");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("cat:destroy...");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("cat:after properties set...");
    }
}

注册这个Bean:

@Configuration
@ComponentScan("com.study.bean")
public class MainConfig3 {
    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }
    @Bean
    public Cat cat(){	//这次新注册的Bean
        return new Cat();
    }
}

测试一下:

public class IOCTest_LifeCycle {
    @Test
    public void test1(){
        AnnotationConfigApplicationContext context = 
            new AnnotationConfigApplicationContext(MainConfig3.class);
        System.out.println("容器创建完成");
        context.close();
    }
}

image-20200330011152040

三、用@PostConstruct和@PreDestroy来标明初始化和销毁方法

JSR250所提供的两个注解,直接看它的注释:

The PostConstruct annotation is used on a method that needs to be executed after dependency injection is done to perform any initialization.(PostConstruct注释用于需要在依赖项注入完成后执行的方法,以便执行任何初始化。)

The PreDestroy annotation is used on methods as a callback notification to signal that the instance is in the process of being removed by the container.(PreDestroy注释用于方法上,作为一个回调通知,通知该实例正在被容器删除的过程中。)

  • @PostConstructor:在bean创建并赋值完成后,执行被标注的方法进行初始化
  • @PreDestroy:在容器销毁bean之前,执行被标注方法

新建Bean:Dog

public class Dog {
    public Dog(){
        System.out.println("dog constructor...");
    }
    //对象创建并赋值之后调用
    @PostConstruct
    public void init(){
        System.out.println("dog @PostConstruct...");
    }
    //容器销毁对象之前调用
    @PreDestroy
    public void destroy(){
        System.out.println("dog @PreDestroy...");
    }
}

同上,在配置类中注册Bean,或给Dog打上@Component直接在配置类扫描组件,不做赘述。直接看测试结果:

image-20200330013115065


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:Spring注解学习_生命周期1_初始化和销毁方法

文章字数:791

本文作者:梅罢葛

发布时间:2020-03-30, 00:23:45

最后更新:2020-03-30, 01:50:47

原始链接:https://qiurungeng.github.io/2020/03/30/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F1-%E5%88%9D%E5%A7%8B%E5%8C%96%E5%92%8C%E9%94%80%E6%AF%81%E6%96%B9%E6%B3%95/
目录
×

喜欢就点赞,疼爱就打赏