Spring中Bean初始化和销毁的多种方式

Spring中Bean初始化和销毁的多种方式

  • 一、Bean的多种初始化方式
    • 1.PostConstruct注解
    • 2.实现InitializingBean接口
    • 3.声明init-method方法
  • 二、Bean的多种销毁方式
    • 1.PreDestroy注解
    • 2.实现DisposableBean接口
    • 3.声明destroy-method方法
  • 三、总结

Spring中支持在Bean的加载时声明初始化方法,该方法会在Bean对象完成初始化之前进行执行,可以为对象指定一些特定的行为,同样的Bean销毁时,也是支持这个动作的。其中因为对象的作用域不同,销毁的表现形式略有区别。初始化都没有区别,无论是单例、原型、request、session、global session等他们的创建时初始化都没啥区别,但是销毁会略有区别,单例模式默认不会销毁,只有在Spring容器被销毁时才会执行Bean的销毁,从而执行他的销毁方法。session、request等他们是作用范围到了就会被销毁,并不会长期存在,所以他们的销毁方法是在作用范围执行之后来调用的。

一、Bean的多种初始化方式

Spring中总共支持了三种方式对Bean进行初始化,依次是在方法上使用PostConstruct注解、实现InitializtingBean接口重写对应方法、声明init-method方法来实现,且他们三个支持并行。也就是说我们可以三个都是用,当三个都是用时就是按照下面的顺序执行的,即限制性PostConstruct注解的方法,再执行InitializingBean的方法,最终执行init-method的方法。

1.PostConstruct注解

如下所示,这里使用配置类的方式进行注入,因为一会延时init-method必须使用配置类才可以实现,启动容器当加载TestA这个Bean时,他的初始化方法就会被执行。

@Configuration
public class TestInitmestond {@Beanpublic TestA getBeanA(){return new TestA();}
}class TestA{@PostConstructpublic void postConstructor(){System.out.println("这是使用了PostConstruct注解的初始化方法");}}

2.实现InitializingBean接口

下面是结合了第一种和第二种的初始化方式:

@Configuration
public class TestInitmestond {@Beanpublic TestA getBeanA(){return new TestA();}
}class TestA implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("这是实现InitializingBean的初始化方法");}@PostConstructpublic void postConstructor(){System.out.println("这是使用了PostConstruct注解的初始化方法");}}

3.声明init-method方法

init-method方法必须使用配置类进行加载Bean才可以配置,因为该属性是Bean标签的属性,在注解中也就是Bean注解的属性,所以我们使用Component等其他IOC注解时是无法指定的。

@Configuration
public class TestInitmestond {@Bean(initMethod = "initMethod")public TestA getBeanA(){return new TestA();}
}class TestA implements InitializingBean {@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("这是实现InitializingBean的初始化方法");}@PostConstructpublic void postConstructor(){System.out.println("这是使用了PostConstruct注解的初始化方法");}public void initMethod(){System.out.println("这是使用了init-method声明的初始化方法");}
}

下面启动下容器展示下他们的执行顺序,如下:
在这里插入图片描述
可以看到他们的顺序是固定的即:PostConstruct—>initializingBean—>init-method.

二、Bean的多种销毁方式

同样的Spring也支持了三种销毁的方式,且这三种销毁方式与三种创建方式是完全对应的。同时与初始化方法一样Spring也是支持三种销毁方法的并行的。且他们并行时顺序是固定的:执行PreDestroy–>DisposableBean–>destroy-method.

1.PreDestroy注解

这里容器采用手动启动的方式进行创建,然后为容器设置一个销毁的钩子,这样当容器销毁时我们就可以去执行销毁方法了,对于单例模式的销毁方法只能通过这种测试了,若是我们直接停止IDEA的服务是不会执行销毁方法的。不过对于scope不是singleton的Bean来说,比如request在正常服务里是可以体现销毁动作的。

public class TestDestroyMethod {//手动启动容器,模拟关闭public static void main(String[] args) {AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(TestConfig.class);annotationConfigApplicationContext.start();annotationConfigApplicationContext.registerShutdownHook();}
}
@Configuration
class TestConfig{@Beanpublic TestB getBean(){return new TestB();}
}
class TestB{@PreDestroypublic void preDestroy(){System.out.println("这是使用PreDestroy注解的销毁方法");}
}

2.实现DisposableBean接口

这种就是直接实现接口重写destroy方法即可

public class TestDestroyMethod {//手动启动容器,模拟关闭public static void main(String[] args) {AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(TestConfig.class);annotationConfigApplicationContext.start();annotationConfigApplicationContext.registerShutdownHook();}
}
@Configuration
class TestConfig{@Beanpublic TestB getBean(){return new TestB();}
}
class TestB implements DisposableBean {@PreDestroypublic void preDestroy(){System.out.println("这是使用PreDestroy注解的销毁方法");}@Overridepublic void destroy() throws Exception {System.out.println("这是实现DisposableBean的方法");}
}

3.声明destroy-method方法

下面是结合了三种销毁方法的代码

public class TestDestroyMethod {//手动启动容器,模拟关闭public static void main(String[] args) {AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(TestConfig.class);annotationConfigApplicationContext.start();annotationConfigApplicationContext.registerShutdownHook();}
}
@Configuration
class TestConfig{@Bean(destroyMethod = "destroyMethod")public TestB getBean(){return new TestB();}
}
class TestB implements DisposableBean {@PreDestroypublic void preDestroy(){System.out.println("这是使用PreDestroy注解的销毁方法");}@Overridepublic void destroy() throws Exception {System.out.println("这是实现DisposableBean的方法");}public void destroyMethod(){System.out.println("这是制定了destroy-method的销毁方法");}
}

下面是执行的截图,可以看到三种销毁方式与初始化方式一样都是有固定顺序的,事实上初始化方式与销毁方式他们是有对应关系的。
PostConstruct与PreDestroy是一组,InitializingBean与DisposableBean是一组,init-method与destroy-method是一组。
在这里插入图片描述

三、总结

这篇总结了Spring中Bean的初始化和销毁的多种方式,没什么特别的地方,希望可以帮到路过的你
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/353993.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

LayaAir destroy 销毁与 removeChild 移除节点

目录 destroy 释放内存 编码示例 removeChild 移除节点 destroy 销毁节点 1、JavaScript 运行时无法启动垃圾回收器,要确保一个对象能够被回收,需要删除对该对象的所有引用。Sprite 提供的 destory() 方法会帮助设置对象内部引用为 null。 2、例如…

Javascript removeChild()不能删除全部子节点的解决办法

在Javascript中,只提供了一种删除节点的方法:removeChild()。 removeChild() 方法用来删除父节点的一个子节点。 语法: parent.removeChild(thisNode) 参数说明: 参数 说明 thisNode 当前节点,即要删除的节点 parent 当…

CSDN 每日一练用例数据缺失了怎么办?

CSDN 每日一练用例数据缺失了怎么办? 引子1、用例与结果不匹配2、阅读理解困难3、用例数据缺失 用例数据缺失,却有人 AC ?神奇的 c28761 津津的储蓄计划70093 近视的小张 小结最后的吐槽 引子 老顾最近几个月经常在 CSDN 举办的周赛上浑水摸…

Spring中bean的初始化和销毁几种实现方式详解

关联博文:Spring中Bean的作用域与生命周期 Bean的生命周期 : 创建bean对象 – 属性赋值 – 初始化方法调用前的操作 – 初始化方法 – 初始化方法调用后的操作 – …-- 销毁前操作 – 销毁方法的调用。 先放一张图吧。 【1】init-method和destroy-me…

js-removeChild()

下面给大家介绍Javascript removeChild()删除节点的方法,具体详情如下所示: 在Javascript中,只提供了一种删除节点的方法:removeChild()。 removeChild() 方法用来删除父节点的一个子节点。 语法: parent.removeCh…

删除节点removeChild()

removeChild() 方法从子节点列表中删除某个节点。如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL。 语法: nodeObject.removeChild(node) 参数: node :必需,指定需要删除的节点。 我们来看看下面代码&a…

Js removeChild、addChild

1. <html><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><title>添加删除记录练习升级</title><link rel"stylesheet" type"text/css" href"ex_2_style/css.css&qu…

【注意】js 里面 removeChild 使用的坑

这有坑啊&#xff0c;使用removeChild 循环删除 子元素们的时候 是【0】而不是【i】 这是因为 你每次删完一个 子元素们的 下标就会发生改变 比如 allSpan【0】 allSpan【1】 removeChild(allSpan【0】) 以后 &#xff0c;allSpan【1】 就不再是 allSpan【1】了&#xff0c;…

关于removeChild() 方法

removeChild() 方法 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 开发工具与关键技术&#xff1a; JS 撰写时间&#xff1a;2021/7/8 注意红色箭头指向内容&#xff0c;本文将分为6张图片&#xff0c;并按从上到下顺序操作 1.我们先简…

4.C++多线程-- unique_lock(类模板)

1.unique_lock 1. unique_lock<mutex> myUniLock(myMutex); 完全可以取代lock_guard 2. unique_lock 也可以使用----std::adopt_lock 3.使用adopt_lock&#xff0c;之前要先使用lock. 4.std::chrono::milliseconds my_sleepTime(20000)//20000毫秒 std::this_thread:…

打开浏览器的同时会在主页外同时打开芒果TV,抖音等网站

问题&#xff1a;每次打开谷歌浏览器的同时会同时打开芒果TV&#xff0c;抖音等网站。导致每次都要进行网页关闭&#xff0c;非常麻烦。 解决&#xff1a;在扩展程序中有一个叫做“省钱购”的程序&#xff0c;只需要将其移走就可以了。 扩展程序的位置&#xff1a;自定义及控…

最新超漂亮UI仿芒果TV听书网站模板双端+苹果CMS内核

正文: 苹果cms超漂亮UI高仿芒果TV听书网站模板带手机端。 手机版修改logo&#xff0c;ting_wap/images/logo.png 电脑版修改logo&#xff0c;ting_pc/img/logo.png 编辑推荐后台推荐5颗星&#xff0c;新势力/热播榜单后台推荐9颗星。 程序: wwyfeu.lanzoum.com/iQ0F00gbt…

芒果播放器介绍

芒果播放器 芒果全能播放器能播放所有格式的视频、音频文件、以及主流图片文件。短小精悍、简洁明了、绿色&#xff0c;无广告&#xff0c;其FLASH播放比暴风音影更真实。原本为教育教学服务&#xff0c;广大师生反应较好&#xff0c;现全面推广。 【1.1版下载地址】 http://…

非常简单下载芒果tv视频的方法(无需安装任何软件)

1、打开芒果tv网站&#xff0c;找到需要下载的视频地址比如&#xff1a;https://www.mgtv.com/b/328606/5533377.html?fpase 2、打开网页&#xff1a;https://www.parsevideo.com/mgtv/ 3、输入需要分析的视频地址&#xff1a; 4、分析结果如下&#xff0c;并点击第二行的下…

最新芒果TV视频下载方法-马赛克视频助手

芒果TV是一款资源丰富的互联网视频平台。它除了可以看视频外&#xff0c;还可以将这些视频下载下来。但官方是不支持视频下载的&#xff0c;那么芒果TV该怎么下载视频么&#xff1f;接下来就让我们一起去看看吧。 今天小编就教大家如何把上面喜欢的视频下载下来 1.这里我们需…

芒果TV 2021 互联网人才招聘

长沙&#xff0c;关键词是什么&#xff1f; 小龙虾、臭豆腐 马栏山 中国最具幸福感城市 芒果TV&#xff0c;关键词是什么&#xff1f; 天生青春&#xff0c;NO.1 中国互联网百强 世界媒体五百强 理想&#xff0c;非得在北上广实现么&#xff1f; 其实&#xff0c;追梦的路上不一…

Android TV 开发之 TV视频播放器

Android TV视频播放器VideoView 不想往下看可以直接在GitHub上面克隆到自己的项目中 GitHub地址 闲谈 最近公司又给了一个新任务&#xff0c;说要做电视机顶盒开发&#xff0c;这个机顶盒开发之前也没有接触过啊&#xff0c;没经验&#xff0c;这使我走了很多坑&#xff0c;写…

芒果TV会员,月卡最低9.9元,年卡最低128元!

全国首部湘商题材电视剧《一代洪商》&#xff0c;将于3月27日在央视八套&#xff08;电视剧频道&#xff09;播出&#xff0c;芒果TV将线上播出。该剧由王少华编剧&#xff0c;路奇担纲导演&#xff0c;孟凡耀担任总制片人&#xff0c;张丰毅、李立群、张睿、张含韵等人主演&am…

芒果tv官网服务器维护,芒果tv看不了【解决方案】

win7系统有很多人都喜欢使用,我们操作的过程中常常会碰到win7系统芒果tv看不了的问题。如果遇到win7系统芒果tv看不了的问题该怎么办呢&#xff1f;很多电脑水平薄弱的网友不知道win7系统芒果tv看不了究竟该怎么解决&#xff1f;其实不难根据下面的操作步骤就可以解决问题1.DNS…