javascript
Spring框架:三种Spring Bean生命周期技术
當使用術語“生命周期”時,Spring的家伙指的是您的bean的構造和破壞,通常這與Spring Context的構造和破壞有關。 在某些情況下,Bean生命周期的管理不是一件容易的事,因為需要它執(zhí)行自己的內部設置。 當您的bean必須與外部系統(tǒng)進行交互時,通常包括:加載文件,打開套接字或從數據庫中讀取一些數據,這通常是正確的。 它到底有什么關系,要解決這個問題,您所需要的只是讓Spring在加載Spring Context并將其關閉時調用您的bean。
為此,Spring提供了三種在初始化和關閉期間調用代碼的方式。 這些是:
- 以編程方式,通常稱為“接口回調”。
- 以每個bean為基礎進行聲明,稱為“方法回調”。
- 通過對所有bean應用相同的默認方法回調進行聲明。
接口回調是我之前所描述的。 但是,為了總結該技術并確保Spring在設置和刪除Spring Context期間調用您的bean,您的bean必須實現特定的接口。 在初始化的情況下,它是InitializingBean ;在關閉的情況下,它是DisposableBean 。 如果您需要更多有關這些技術的知識,那么這里是有關InitializingBean的博客和有關DisposableBean 的博客 。
我實際上認為“方法回調”這個名稱有些誤導,因為它并未真正描述正在發(fā)生的事情。 使用方法回調時,您正在做的是將方法添加到bean中,然后在XML配置中引用該方法。 當Spring讀取配置文件時,它會發(fā)現有一個類型為X的bean,其中有一個方法需要在啟動時調用,而另一個方法則需要在關閉時調用。
現在我們需要一個方案,并且因為使用bean回調方法的原因之一是您可以初始化外部系統(tǒng),所以我建議您正在為一家直銷公司工作,并且已經獲得編寫其中一個煩人的應用程序的工作,該應用程序在半夜撥打隨機數字并向接收方播放一條記錄的消息,告訴接收方如何通過起訴某家公司來獲得意外傷害賠償(又名現金)他們從未有過。
這個想法是Dialer是一個外部系統(tǒng),您必須為其編寫控制器。 當控制器啟動時,它必須連接至撥號器,而在其關閉時,請斷開連接。
/*** Dial the number** @param phoneNumber* the phone number as a string* @return true if the number is dialed successfully*/public boolean dial(String phoneNumber);/*** Play a message*/public void playMessge();/*** Hang up the line...*/public boolean hangUp();DialerController由上面的接口定義,并且您可以期望它具有一些電話類型的方法,例如playMessage() dial(...) , playMessage()和hangUp() 。 接下來要做的是創(chuàng)建一個實現這些方法的bean,我將在下面完成。
@Component public class DialerControllerImpl implements DialerController {private boolean connected;@Overridepublic boolean dial(String phoneNumber) {boolean retVal = false;if (isMiddleOfTheNight()) {testConnection();System.out.println("Dialing number: " + phoneNumber);retVal = true;}return retVal;}private boolean isMiddleOfTheNight() {return true;}@Overridepublic void playMessge() {testConnection();System.out.println("Hello, do not hang up you may be entitled to...");}@Overridepublic boolean hangUp() {testConnection();System.out.println("Hangup!");return true;}public void init() {connected = true;System.out.println("Connect to dialer");}public void destroy() {connected = false;System.out.println("Close connection to dialer");}private void testConnection() {if (connected == false) {throw new RuntimeException("Not connected to external system error");}} }playMessage() dial(...) , playMessage()和hangUp()方法沒什么特別的; 他們檢查Bean是否已連接到它正在對接的外部撥號程序,然后執(zhí)行其工作。 此類的有趣之處在于init()和destroy()方法,因為這是我們希望Spring在啟動和關閉期間分別調用的方法。
為了確保Spring確實調用了我們的bean,我們需要在Spring配置XML中做些麻煩。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"><bean id="dialerController" class="example_2_lifecycle_management.method_based.DialerControllerImpl" init-method="init" destroy-method="destroy" /></beans>在此示例中,我使用了顯式的bean配置(這意味著您可以忽略上面代碼中的@Component屬性,因為它目前尚未使用,但稍后需要使用),并且需要注意的是bean配置附加屬性init-method和destroy-method 。 這些用于定義Spring初始化和關閉時要調用的bean方法的名稱。 在此示例中,它們對應于上面DialerControllerImpl類中的init()和destroy()方法。
@Testpublic void testLifeCycle_using_per_bean_declaration() {ctx = new ClassPathXmlApplicationContext("dialer.xml");ctx.registerShutdownHook();instance = ctx.getBean(DialerControllerImpl.class);if (instance.dial("555-1234")) {instance.playMessge();instance.hangUp();}} 上面的代碼演示了運行代碼的簡單單元測試(這不是真正的測試,因為它沒有聲明任何內容)。 這里要注意的要點是,在創(chuàng)建Spring Application Context之后,我添加了一個調用
registerShutdownHook() 。 這是因為您需要告訴JVM告訴Spring調用您的destroy()方法。 就像我在DisposableBean博客中所做的那樣,您可以自己創(chuàng)建和處理shutdown鉤子,有時這樣做有很多好處,但在以后的日子里,還會有更多好處。
我現在聽到的問題是“如果我使用自動裝配會怎樣?” 事實證明,Spring的Guys在Spring 3.1中添加了一種新的聲明性方法回調技術,稱為“默認方法回調”。 這里的一個大想法是,您在XML配置文件頂部的<beans/>元素中聲明初始化和關閉方法的名稱,如下所示:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"default-init-method="init" default-destroy-method="destroy"><!-- Enable autowiring --><context:component-scan base-package="example_2_lifecycle_management.method_based" /> </beans> 選擇bean生命周期技術時,請記住Spring專家建議您選擇基于方法的回調而不是基于接口的回調。 原因是在選擇接口回調路由時,您將bean綁定到了Spring。 這可能是(也可能不是)問題,而這實際上取決于您的應用程序的其余部分,因為使用其他許多Spring技術也會將您的應用程序綁定到Spring。
參考: Spring框架: Captain Debug博客博客中來自JCG合作伙伴 Roger Hughes的三種Spring Bean生命周期技術 。
翻譯自: https://www.javacodegeeks.com/2013/02/spring-framework-three-spring-bean-lifecycle-techniques.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring框架:三种Spring Bean生命周期技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果电脑装双系统安装教程(oppo双系统
- 下一篇: 什么是设备的运行状态 关于设备运行状态介