一、通过@Bean指定初始化和销毁方法

在以往的xml中,我们是这样配置的

<bean id="exampleInitBean" class="examples.ExampleBean" init-method="init" destroy-method="cleanup"/>

那如果采用注解 的方式该如何配置呢?

首先我们创建一个Car,

public class Car {

	public Car(){
System.out.println("car constructor..."); // 构造方法
} public void init(){
System.out.println("car ... init..."); // 初始化方法
} public void detory(){
System.out.println("car ... detory..."); // 销毁方法
} }

我们需要通过配置类将这个Car注册进容器中,当然这很简单。

@Configuration
public class MainConfigOfLifeCycle { //@Scope("prototype")
@Scope("singleton") // 默认即单例
@Bean(initMethod="init",destroyMethod="detory")
public Car car(){
return new Car();
} }

这样就搞定了,在ioc容器启动的时候,将会把Car这个类加载进容器创建其单例对象。

那我们主要是观察其初始化和销毁方法

测试方法:

	@Test
public void test01(){
//1、创建ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成..."); //applicationContext.getBean("car");
//关闭容器
applicationContext.close();
}

打印其输出,

car constructor...
car ... init...
容器创建完成...
cat...destroy...

小结: bean的生命周期:bean创建---初始化----销毁的过程,

容器管理bean的生命周期;

我们可以自定义初始化和销毁方法;

容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法

观察上面的结果,也可以发现,在单例模式下,容器启动时则创建单例的car对象,并调用其初始化方法init,当容器要关闭时,执行其销毁方法destroy。

在多例模式下,这里没测,多例模式下,当我们主动获取对象的时候,容器才会创建bean,类似于一种懒加载机制,另外,在多例模式下,我们观察不到销毁方法的执行,因为多例模式下,spring的ioc不再管理我们自定义的销毁方法。

二、实现InitializingBean,DisposableBean定义初始化和销毁方法

InitializingBean接口只有一个抽象方法:

void afterPropertiesSet() throws Exception;

DisposableBean接口也只有一个抽象方法

void destroy() throws Exception;

我们写一个普通类继承这两个接口 ,

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component; @Component
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...afterPropertiesSet...");
}
}

编写一个测试方法,启动ioc容器,测试它的生命周期

	@Test
public void test01(){
//1、创建ioc容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
System.out.println("容器创建完成..."); //applicationContext.getBean("car");
//关闭容器
applicationContext.close();
}

控制台打印:

cat constructor...
cat...afterPropertiesSet...
容器创建完成...
cat...destroy...

从方法名就能看出,在cat这个对象的的属性都被注入之后,就会调用afterPropertiesSet这个方法

再容器销毁前,会调用Cat类的destroy方法。

三、通过@PostConstruct和@PreDestroy

这两个是JSR250规范中的,标注在方法上,也是在对象创建完成属性赋值之后,同样也是在容器销毁之前@PreDestroy标注的方法会被调用

我们也来举例测试一下,

创建一个Dog类

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

依旧使用上面的测试方法进行测试

输出结果如下

dog constructor...
Dog....@PostConstruct...
容器创建完成...
Dog....@PreDestroy...

四、 小结

以上我们介绍了三种方法对容器中的对象进行初始化和销毁,这只是spring容器中bean生命周期的一小小部分。

这三种方法可以组合进行使用,即Combining lifecycle mechanisms

当组合使用时,那这三种方法的执行顺序是什么呢?

我们不再测试,直接看spring官方文档:

Multiple lifecycle mechanisms configured for the same bean, with different initialization methods, are called as follows:

初始化顺序

  • Methods annotated with @PostConstruct
  • afterPropertiesSet() as defined by the InitializingBean callback interface
  • A custom configured init() method

Destroy methods are called in the same order:

销毁顺序:

  • Methods annotated with @PreDestroy
  • destroy() as defined by the DisposableBean callback interface
  • A custom configured destroy() method

七、spring生命周期之初始化和销毁方法的更多相关文章

  1. 生命周期(初始化、销毁方法、BeanPostProcessor后处理Bean)

    1.初始化和销毁 在目标方法执行前后进行初始化或销毁 (1)在Service方法的实现类里面创建初始化方法和销毁方法: public class StudentServiceImpl implemen ...

  2. Spring的几种初始化和销毁方法

    一 指定初始化和销毁方法 通过@Bean指定init-method和destroy-method: @Bean(initMethod="init",destroyMethod=&q ...

  3. Spring学习笔记之初始化和销毁方法的调用次序

    Multiple lifecycle mechanisms configured for the same bean, with different initialization methods, a ...

  4. 12、生命周期-@Bean指定初始化和销毁方法

    12.生命周期-@Bean指定初始化和销毁方法 Bean的生命周期:创建->初始化->销毁 容器管理bean的生命周期 我们可以自定义初始方法和销毁方法,容器在bean进行到当期那生命周期 ...

  5. 说下spring生命周期

    面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧     Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...

  6. Spring生命周期详解

    导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...

  7. Spring学习总结(4)-Spring生命周期的回调

    参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...

  8. 【源码】spring生命周期

    一.spring生命周期 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用crea ...

  9. spring通过注解注册bean的方式+spring生命周期

    spring容器通过注解注册bean的方式 @ComponentScan + 组件标注注解 (@Component/@Service...) @ComponentScan(value = " ...

随机推荐

  1. 浏览器-同源政策(same-origin policy)

    浏览器安全的基石是“同源政策”(same-origin policy). 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这个政策. 何为同源? 协议相同 域名相同 端 ...

  2. Convert.ToString(null) => null

    { string str0 = Convert.ToString(null); Console.WriteLine("0,{0}", str0); if (str0==" ...

  3. linux 统计某个文件的行数

    今日思语:迷茫的时候,看看身边那些优秀的人,他们还在那么努力,或许你就可以有点方向和动力了 在linux系统中,我们经常会对文件做行数统计,可以使用如下命令 wc -l file #file为具体的文 ...

  4. 2019牛客多校第九场AThe power of Fibonacci——扩展BM

    题意 求斐波那契数列m次方的前n项和,模数为 $1e9$. 分析 线性递推乘线性递推仍是线性递推,所以上BM. 由于模数非质数,上扩展版的BM. 递推多少项呢?本地输入发现最大为与前57项有关(而且好 ...

  5. 3.Vue 实例

    创建一个 Vue 实例 每个 Vue 应用都是通过用 Vue 函数创建一个新的 Vue 实例开始的: var vm = new Vue({ // 选项 }) 虽然没有完全遵循 MVVM 模型,但是 V ...

  6. lambda表达式格式以及应用场景?

    lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. add = lambda x, y : x+y print(add(1,2)) # 结果为3 应 ...

  7. LeetCode 358. Rearrange String k Distance Apart

    原题链接在这里:https://leetcode.com/problems/rearrange-string-k-distance-apart/description/ 题目: Given a non ...

  8. VS2010中使用boost正则表达式库

    1.下载boost库.http://www.boost.org/ 我下载的是boost_1_51_0版本.放在D:\opensource\boost_1_51_0. 2.编译boost库.     执 ...

  9. NVIDIA vGPU License服务器搭建详解

    当配置有vGPU虚拟机发起License授权请求,授权服务器会根据License中所包含的GRID License版本,加载不同的vGPU驱动(普通驱动和专业Quodra卡驱动).目前vPC和vApp ...

  10. 改变Ubuntu命令行 用户名显示前缀

    改变Ubuntu命令行 用户名显示前缀 1.修改命令 [root@daokr ubuntu]#vim ~/.bashrc 修改第 56行 注释掉原来 # PS1='${debian_chroot:+( ...