<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
常規的 Spring IoC 容器中Bean的作用域有兩種:singleton
(單例)和prototype
(非單例)
注:基於Web的容器還有其他種作用域,在這就不贅述了。
singleton
是Spring預設的作用域。當 Bean 的作用域為 singleton 時,Spring IoC 容器中只會存在一個共用的 Bean 範例。可以更好地重用物件,節省重複建立物件的開銷。singleton
(其實也可以不用設定,因為spring預設就是單例模式)案例1
1.建立Dept類
public class Dept { //部門編號 private int deptNo; //部門名稱 private String deptName; }
2.編寫Spring組態檔,並將scope 屬性設定為singleton
<bean id="dept" class="com.bighorn.pojo.Dept" scope="singleton"> </bean>
3.編寫執行程式
public static void main(String[] args) { //獲取IoC容器 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取物件 Dept dept1 = context.getBean("dept", Dept.class); Dept dept2 = context.getBean("dept", Dept.class); //列印物件 System.out.println(dept1); System.out.println(dept2); }
4.結果如下,可以發現列印出的是同一個物件
prototype
表示原型(非單例)模式。當 Bean 的作用域為 prototype時,Spring 容器會在每次請求該 Bean 時,都建立一個新的 Bean 範例。prototype
案例2
1.只需修改scope 屬性為prototype
,其他程式碼不變。
<bean id="dept" class="com.bighorn.pojo.Dept" scope="prototype"> </bean>
2.執行結果如下
spring bean預設為單例,避免了物件的頻繁建立與銷燬,達到了bean物件的複用,效能高。
像表現層、業務層、資料層、工具類物件只需要呼叫方法,比較適合交給Spring IoC容器管理
但是像那種需要封裝範例的域物件,因為會引發執行緒安全問題,不適合交給Spring IoC容器管理。
Spring Bean生命週期:Spring Bean 物件從建立到銷燬的整體過程。
Spring Bean生命週期大致可以分為以下 5 個階段:1.Bean 的範例化、2.Bean 屬性賦值、3.Bean 的初始化、4.Bean 的使用、5.Bean 的銷燬
Spring 根據 Bean 的作用域來選擇 Bean 的管理方式。
綜上所述: 為了更好研究如何控制bean週期,下面案例中建立的bean預設都使用單例模式。
由於ApplicationContext
類中沒有關閉容器的方法,所以想要關閉容器需要用到ApplicationContext
的子類——ClassPathXmlApplicationContext
類。該類又有兩種方法可以關閉容器
1、close關閉容器
close()
方法,在呼叫的時候關閉容器
//獲取 ClassPathXmlApplicationContext 容器 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //呼叫close方法關閉容器 context.close();
2、註冊勾點關閉容器
registerShutdownHook()
方法,在JVM退出前呼叫關閉容器
//獲取 ClassPathXmlApplicationContext 容器 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //呼叫註冊狗子關閉容器 context.registerShutdownHook();
Bean 的生命週期回撥方法主要有兩種:
我們可以通過以下 2種方式自定義 Bean 的生命週期回撥方法:
我們可以在 Spring Bean 的 Java 類中,通過實現 InitializingBean
和 DisposableBean
介面,指定 Bean 的生命週期回撥方法。
案例1
1.建立User類,並實現InitializingBean
, DisposableBean
介面,重寫afterPropertiesSet()
和destroy()
方法。程式碼如下
/** * 繼承介面,程式初始化回撥和銷燬回撥方法 */ public class User implements InitializingBean, DisposableBean { String name; int age; //setter方法 public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } //初始化回撥方法 @Override public void afterPropertiesSet() throws Exception { System.out.println("這是初始化回撥方法"); } //銷燬回撥方法 @Override public void destroy() throws Exception { System.out.println("這是銷燬回撥方法"); } //toString方法 @Override public String toString() { return "User{" + "name='" + name + ''' + ", age=" + age + '}'; } }
2.編寫spring組態檔
<bean id="user" class="com.bighorn.pojo.User"> <property name="name" value="bighorn"/> <property name="age" value="18"/> </bean>
3.編寫執行程式
public class App { public static void main(String[] args) { //獲取 ClassPathXmlApplicationContext 容器 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取物件 User user = context.getBean("user", User.class); //使用bean System.out.println(user); //呼叫close方法關閉容器 context.close(); } }
4.執行結果如下
注意:由於通過介面設定生命週期的方式會導致程式碼的耦合性過高,所以通常情況下,我們會通過xml設定生命週期。
通過 <bean> 元素中的 init-method
和 destory-method
屬性,指定 Bean 的生命週期回撥方法。
案例2
1.建立User類,這次不需要繼承那兩個介面了,但要在新增兩個普通方法(方法名可任意):init()
和destory()
代表初始化和銷燬方法。程式碼如下
/** * 通過XML設定指定回撥方法 */ public class User { String name; int age; //setter方法 public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } //初始化回撥方法 public void init() throws Exception { System.out.println("這是初始化回撥方法"); } //銷燬回撥方法 public void destroy() throws Exception { System.out.println("這是銷燬回撥方法"); } //toString方法 @Override public String toString() { return "User{" + "name='" + name + ''' + ", age=" + age + '}'; } }
2.編寫spring組態檔,在<bean>元素裡新增init-method
和destroy-method
屬性,並指定User類中自定義的init和destory方法(關鍵)
<!--通過XML設定指定回撥方法--> <bean id="user" class="com.bighorn.pojo.User" init-method="init" destroy-method="destroy"> <property name="name" value="bighorn"/> <property name="age" value="18"/> </bean>
3.執行程式和執行結果都與案例1相同,這裡就少些筆墨介紹了
到此這篇關於一文搞懂Spring Bean中的作用域和生命週期的文章就介紹到這了,更多相關Spring Bean作用域 生命週期內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45