1. 使用@Bean注解定义initMethod和destroyMethod

所谓initMethod和destroyMethod,是指在springIOC容器中,对于bean对象执行到初始化阶段和销毁阶段所调用的方法,其并不是初始化方法和销毁方法本身。

对于单例模式,initMethod会在创建容器时,构造方法、属性赋值方法完成之后调用,destroyMethod会在关闭容器之后调用;

对于原型模式,initMethod会在每次获取bean对象时,构造方法、属性赋值方法完成之后调用,而destroyMethod则不会调用,换句话说,对于多实例bean,springIOC容器只负责创建,不负责销毁。

/*** 使用@Bean注解的方式定义initMethod和destroyMethod* initMethod方法:* 是springIOC容器执行到初始化bean对象阶段时调用的方法,并不是初始化bean对象方法本身* 对于单实例模式,是在创建容器之后执行,只执行一次* 对于多实例模式,是在获取bean对象时执行,每获取一次,则执行一次* destroyMethod方法:* 是springIOC容器执行到销毁bean对象阶段时调用的方法,并不是销毁bean对象方法本身* 对于单例模式,是在关闭容器之前执行* 对于多实例模式,ICO容器不负责销毁对象,因此销毁方法也不负责执行*/
@Configuration
public class LifeBeanConfig {/*** 单例模式注册Car* bean初始化阶段调用onInit方法* bean销毁阶段调用onDestroy方法*/@Bean(value = "singleCar", initMethod = "onInit", destroyMethod = "onDestroy")@Scope(value = SCOPE_SINGLETON)public Car singleCar() {//调用无参构造器创建Car对象Car car = new Car();//设置属性car.setMake("BMW X5");car.setPrice(600000);//返回Car对象return car;}/*** 多例模式注册Car* bean初始化阶段调用onInit方法* bean销毁阶段调用onDestroy方法*/@Bean(value = "multiCar", initMethod = "onInit", destroyMethod = "onDestroy")@Scope(value = SCOPE_PROTOTYPE)public Car multiCar() {//调用无参构造器创建Car对象Car car = new Car();//设置属性car.setMake("BMW X5");car.setPrice(600000);//返回Car对象return car;}
}

测试单例模式

    /*** 测试使用单实例@Bean注解定义初始化和销毁阶段调用的方法*/@Testpublic void test1() {//创建springIOC容器ApplicationContext applicationContext = new AnnotationConfigApplicationContext(LifeBeanConfig.class);System.out.println("创建springIOC容器完成...");//从容器中获取bean对象Car car = (Car) applicationContext.getBean("singleCar");System.out.println("获取bean对象完成...");//关闭springIOC容器
        ((AnnotationConfigApplicationContext)applicationContext).registerShutdownHook();System.out.println("关闭springIOC容器完成...");}

测试结果

正在调用Car的无参构造方法……
正在为Car的make属性赋值……
正在为Car的price属性赋值……
car正在初始化……
创建springIOC容器完成...
获取bean对象完成...
关闭springIOC容器完成...
car正在销毁……

从测试结果看出,对于单例模式,初始化是在创建springIOC容器时,在执行完构造方法和属性赋值方法之后执行的,销毁是在关闭容器之后执行的

测试原型模式

    /*** 测试使用多实例@Bean注解定义初始化和销毁阶段调用的方法*/@Testpublic void test2() {//创建springIOC容器ApplicationContext applicationContext = new AnnotationConfigApplicationContext(LifeBeanConfig.class);System.out.println("创建springIOC容器完成...");//从容器中获取bean对象Car car = (Car) applicationContext.getBean("multiCar");System.out.println("获取bean对象完成...");//关闭springIOC容器
        ((AnnotationConfigApplicationContext)applicationContext).registerShutdownHook();System.out.println("关闭springIOC容器完成...");}

测试结果

创建springIOC容器完成...
正在调用Car的无参构造方法……
正在为Car的make属性赋值……
正在为Car的price属性赋值……
car正在初始化……
获取bean对象完成...
关闭springIOC容器完成...

从测试结果可以看出,对于原型模式,初始化是在获取bean对象时,在执行完构造方法和属性赋值方法之后执行的,没有销毁过程,即使容器关闭也并没有销毁。

2. 通过实现spring提供的接口,定义初始化阶段和销毁阶段需要执行的方法

在bean类上实现InitializingBean,其实现方法afterPropertiesSet会在初始化阶段完成了构造方法和属性赋值之后被执行,相当于上述initMethod;

同理,在bean类上实现DisposableBean接口,其实现方法destroy为在销毁阶段关闭了容器之后被执行,相当于上述destroyMethod。

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;/*** bean类* 通过实现spring提供的接口,定义在初始化和销毁阶段要调用的方法*/
public class Bus implements InitializingBean, DisposableBean {/*** 初始化阶段,在完成属性赋值方法之后调用的方法* @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("正在对bus对象进行初始化...");}/*** 销毁阶段,在关闭容器之后调用的方法* @throws Exception*/@Overridepublic void destroy() throws Exception {System.out.println("正在对bus对象进行销毁...");}...
}

3. 通过加JSR-250规范的注解,定义初始化阶段和销毁阶段需要执行的方法

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** bean类* 通过加JSR-250注解,定义在初始化和销毁阶段要调用的方法*/
public class Bus {//初始化阶段调用的方法
    @PostConstructpublic void postConstruct() {System.out.println("postConstruct...");}//销毁阶段调用的方法
    @PreDestroypublic void preDestroy() {System.out.println("preDestroy...");}...
}

那么,在同一个bean类上定义initMethod/destroyMethod方法、实现InitializingBean/Disposable接口、加PostContruct/PreDestroy注解,这三组方法的执行顺序如何?经测试,JSR-250注解先执行,spring接口第二个执行,bean注解声明的initMethod/destroyMethod最后执行。

package cn.monolog.entity;import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;/*** bean类* 分别通过三种方式定义初始化阶段和销毁阶段要调用的方法*/
public class Bus implements InitializingBean, DisposableBean {//初始化阶段调用的方法,需要在配置类的@Bean注解中将该方法定义为initMethodpublic void onInit() {System.out.println("initMethod...");}//销毁阶段调用的方法,需要在配置类的@Bean注解中将该方法定义为destroyMethodpublic void onDestroy() {System.out.println("destroyMethod...");}/*** 初始化阶段,在完成属性赋值方法之后调用的方法* @throws Exception*/@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("InitializingBean...");}/*** 销毁阶段,在关闭容器之后调用的方法* @throws Exception*/@Overridepublic void destroy() throws Exception {System.out.println("DisposableBean...");}//初始化阶段调用的方法
    @PostConstructpublic void postConstruct() {System.out.println("postConstruct...");}//销毁阶段调用的方法
    @PreDestroypublic void preDestroy() {System.out.println("preDestroy...");}...
}

@Testpublic void test() {//创建springIOC容器ApplicationContext applicationContext = new AnnotationConfigApplicationContext(LifeBeanConfig.class);System.out.println("创建springIOC容器完成...");//关闭springIOC容器
        ((AnnotationConfigApplicationContext)applicationContext).registerShutdownHook();System.out.println("关闭springIOC容器完成...");}

测试结果:

正在调用bus的无参构造方法...
正在对bus的make属性进行赋值...
正在对bus的price属性进行赋值...
postConstruct...
InitializingBean...
initMethod...
创建springIOC容器完成...
关闭springIOC容器完成...
preDestroy...
DisposableBean...
destroyMethod...

转载于:https://www.cnblogs.com/dubhlinn/p/10664402.html

三种方式创建bean对象在springIOC容器中初始化、销毁阶段要调用的自定义方法相关推荐

  1. 把对象的创建交给spring来管理——  1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期

    把对象的创建交给spring来管理 spring对bean的管理细节     1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期 创建Bean的三种方式 ...

  2. 使用三种方式创建Class字节码类文件对象

    /*** 使用三种方式创建Class字节码类文件对象** @author silence*/ public class Demo1 {public static void main(String[] ...

  3. android圆形点击效果,Android 三种方式实现自定义圆形页面加载中效果的进度条

    [实例简介] Android 三种方式实现自定义圆形页面加载中效果的进度条 [实例截图] [核心代码] ad376a86-a9aa-49bc-8cea-321bcff2c0c3 └── AnimRou ...

  4. 元素隐藏的三种方式对比(针对移动端项目中的按钮,先隐藏且不能被点击 visibility:hidden)

    元素隐藏的三种方式对比 display:none opacity:0 visibility:hidden 项目需求 表面一个图片遮罩,鼠标hover遮罩消失,内部元素展现,其中有一个按钮在移动端是手指 ...

  5. 多线程初探:三种方式创建多线程详细示例

    多线程即在同一时间,可以做多件事情. 创建多线程有3种方式,分别是继承线程类,实现Runnable接口,匿名类 一:线程概念 首先要理解进程(Processor)和线程(Thread)的区别 进程:启 ...

  6. mysql的调用有哪三种方式_MySQL数据库之mysql命令行中执行sql的几种方式总结

    本文主要向大家介绍了MySQL数据库之mysql命令行中执行sql的几种方式总结 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 1.直接输入sql执行 MySQL> se ...

  7. Go三种方式创建赋值map

    var与冒号相等,有了var就不用有冒号,有冒号就不用有var: package mainimport ("fmt" )func main(){// 方式一 :原生普通方式var ...

  8. Android 三种方式实现自定义圆形页面加载中效果的进度条

    转载:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=76872 一.通过动画实现 定义res/anim/loading.xml如 ...

  9. spring中bean的细节之三种创建Bean对象的方式

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  10. 创建 Spring容器的三种方式

    一.src路径下打包完在war包的classes层级下 1.Spring容器创建的三种方式 创建Bean容器之后创建对象: 其中第三种使用的是BeanFactory对象 2.spring通过配置文件用 ...

最新文章

  1. element UI el-autocomplete 带输入建议的输入框
  2. 解决python2.x文件读写编码问题
  3. php curl header 下载_PHP通过curl下载文件到浏览器
  4. cocos2dx飞机大战开发记录(3)
  5. 一图学会配置微信云端店员监控收款回调
  6. 网络发现不了其他计算机,win10网络发现不了其他电脑怎么办_win10网络里找不到其他电脑如何处理...
  7. flex布局 justify-content 新属性值 space-evenly
  8. 根据pc值确定出错的代码位置
  9. Windows端口 说明
  10. 四极管:京东物流“后牌照”战略:8月底开放 或分拆
  11. Pycharm 快捷键盘
  12. 搭建自己的服务器并且上传文件到自己的服务器上
  13. 用户留存统计 java_用户留存率以及DNU、DAU、WAU、MAU关系
  14. Blizzard经典之打造最快的Hash表
  15. OverTheWire-Bandit
  16. Windows Server 2012 R2 Standard序列号
  17. 医院选址问题 C++ 弗洛伊德
  18. 动态建立Vxlan隧道实现跨子网互访实验配置(分布式网关单租户多子网场景)
  19. 欧美市场独立站选品技巧
  20. 网络安全合规-Tisax(汽车安全评估讯息交换平台)一

热门文章

  1. FreeSwitch中,RGB颜色转换为YUV
  2. 新句子:没有谁比我更懂XX,抓普也不行
  3. RELEASE版本的RegisterClass()失败
  4. 管理感悟:软件的特性
  5. warning: C4819的解决办法
  6. 绝对引用计算机几级,计算机一级必考的14个Excel函数,让我来告诉你
  7. php并发数据库操作,数据库的并发操作
  8. mysql longtext 查询_mysql,_mysql中longtext存在大量数据时,会导致查询很慢?,mysql - phpStudy...
  9. 织梦++高级搜索php,织梦模板功能进阶 高级搜索页面advancedsearch.php调用自定义字段...
  10. ttl接地是高电平还是低电平_TTL 门电路输入端分别接大电阻接地,小电阻接地,或空接,输入的是什么电平???跟是什么类型的门电路......