【spring注解驱动开发】-生命周期 - @Bean自定义初始化和销毁

本博客demo源码地址
https://github.com/suchahaerkang/spring-annotation.git

bean的生命周期

bean的生命周期:创建 - 初始化 - 销毁
bean的生命周期一般来说是由IOC容器来管理的,但是我们可以自定义初始化和销毁方法。下面我们就来介绍一下bean的三种生命周期以及用@Bean注解自定义初始化和销毁方法

bean创建

bean的创建都是由容器管理的
单实例bean是在容器创建的时候创建的
多实例bean是在使用的时候容器创建的

bean的初始化

bean的初始化也都是由容器管理,如果我们自定义了初始化方法,那么容器在初始化bean的时候就会去调用我们自定义的方法。下面我们就来通过@Bean来自定义一下初始化方法
首先自定义初始化方法

	/**
	 * @description:
	 * @author: sukang
	 * @date: 2020-03-06 9:01
	 */
	public class Car {
	    public Car() {
	        System.out.println("bean创建...");
	    }
	
	    public void init(){
	        System.out.println("bean初始化方法...");
	    }
	}

然后在配置文件中配置初始化方法

	/**
	 * @description:
	 * @author: sukang
	 * @date: 2020-03-06 9:00
	 */
	@Configuration
	public class MainConfigOfLifeCycle {
	
	    @Bean(initMethod = "init")
	    public Car car(){
	        return new Car();
	    }
	}

写个测试用例

 	@Test
    public void test1(){
        //创建容器
        System.out.println("IOC容器创建...");
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
        System.out.println("从容器中获取car的实例...");
        applicationContext.getBean("car");
    }

运行结果
在这里插入图片描述
上面我们是测试的一个单实例初始化情况,我们再看看多实例的初始化
我们将配置文件加上一个多实例的作用域

	/**
	 * @description:
	 * @author: sukang
	 * @date: 2020-03-06 9:00
	 */
	@Configuration
	public class MainConfigOfLifeCycle {
	
	    @Scope("prototype")
	    @Bean(initMethod = "init")
	    public Car car(){
	        return new Car();
	    }
	}

运行结果如下
在这里插入图片描述

bean销毁

首先我们测试一下单实例的销毁,同样我们先自定义一个销毁方法

	/**
	 * @description:
	 * @author: sukang
	 * @date: 2020-03-06 9:01
	 */
	public class Car {
	    public Car() {
	        System.out.println("bean创建...");
	    }
	    
	    public void init(){
	        System.out.println("bean初始化方法...");
	    }
	    
	    public void destroy(){
	        System.out.println("bean销毁方法...");
	    }
	}

然后在配置文件中加上配置上销毁方法并且把作用域改为单实例

	/**
	 * @description:
	 * @author: sukang
	 * @date: 2020-03-06 9:00
	 */
	@Configuration
	public class MainConfigOfLifeCycle {
	
	    @Scope()
	    @Bean(initMethod = "init", destroyMethod = "destroy")
	    public Car car(){
	        return new Car();
	    }
	}

写一下测试用例

 	//测试@Bean自定义初始化和销毁方法
    @Test
    public void test1(){
        //创建容器
        System.out.println("IOC容器创建...");
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
        System.out.println("从容器中获取car的实例...");
        applicationContext.getBean("car");
        System.out.println("IOC容器关闭");
        ((AnnotationConfigApplicationContext) applicationContext).close();
    }

在这里插入图片描述
通过运行结果可以看出,单实例bean是在容器关闭的时候去调用了自定义销毁方法,那么多实例又是什么时候调用销毁方法的呢?
我们将配置文件中的作用域改为多实例

	/**
	 * @description:
	 * @author: sukang
	 * @date: 2020-03-06 9:00
	 */
	@Configuration
	public class MainConfigOfLifeCycle {
	
	    @Scope("prototype")
	    @Bean(initMethod = "init", destroyMethod = "destroy")
	    public Car car(){
	        return new Car();
	    }
	}

运行结果
在这里插入图片描述
从运行结果,我们可以看到多实例Bean在容器关闭的时候不会销毁,其实多实例的销毁不是由容器来管理的,而是自行销毁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值