詳解Java的Spring框架中bean的定義以及生命周期
bean的定義
形成應(yīng)用程序的骨干是由Spring IoC容器所管理的對(duì)象稱(chēng)為bean。bean被實(shí)例化,組裝,并通過(guò)Spring IoC容器所管理的對(duì)象。這些bean由容器提供,例如,在XML的<bean/>定義,已經(jīng)看到了前幾章的形式配置元數(shù)據(jù)創(chuàng)建。
bean定義包含所需要的容器要知道以下稱(chēng)為配置元數(shù)據(jù)的信息:
- 如何創(chuàng)建一個(gè)bean
- Bean 生命周期的詳細(xì)信息
- Bean 依賴(lài)關(guān)系
上述所有配置元數(shù)據(jù)轉(zhuǎn)換成一組的下列屬性構(gòu)成每個(gè)bean的定義。
Spring配置元數(shù)據(jù)
Spring IoC容器完全由在此配置元數(shù)據(jù)實(shí)際寫(xiě)入的格式解耦。有下列提供的配置元數(shù)據(jù)的Spring容器三個(gè)重要的方法:
- 基于XML的配置文件
- 基于注解的配置
- 基于Java的配置
我們已經(jīng)看到了基于XML的配置元數(shù)據(jù)如何提供給容器,但讓我們看到了不同的bean定義,包括延遲初始化,初始化方法和銷(xiāo)毀方法基于XML配置文件的另一個(gè)示例:
<?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.0.xsd"> <!-- A simple bean definition --> <bean id="..." class="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- A bean definition with lazy init set on --> <bean id="..." class="..." lazy-init="true"> <!-- collaborators and configuration for this bean go here --> </bean> <!-- A bean definition with initialization method --> <bean id="..." class="..." init-method="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- A bean definition with destruction method --> <bean id="..." class="..." destroy-method="..."> <!-- collaborators and configuration for this bean go here --> </bean> <!-- more bean definitions go here --> </beans>
bean的生命周期
Spring bean的生命周期是很容易理解。當(dāng)一個(gè)bean實(shí)例化時(shí),它可能需要執(zhí)行一些初始化把它轉(zhuǎn)換成可用狀態(tài)。類(lèi)似地,當(dāng)bean不再需要,并且從容器中取出,一些清理的工作可能也需要做。
不過(guò),還有把bean背后的實(shí)例化和銷(xiāo)毀時(shí)間之間的場(chǎng)景發(fā)生的活動(dòng),但是本章將只討論其中兩個(gè)是需要在bean的初始化和銷(xiāo)毀的時(shí)候,重要bean的生命周期回調(diào)方法。
要定義安裝和拆卸一個(gè)bean,我們只是聲明了初始化方法和/或銷(xiāo)毀,方法的參數(shù)<bean>。在init-method屬性指定一個(gè)方法,是被調(diào)用bean后立即實(shí)例化。同樣,銷(xiāo)毀方法規(guī)定了被調(diào)用當(dāng)bean被從容器中取出之前的方法。
初始化回調(diào):
org.springframework.beans.factory.InitializingBean 接口指定一個(gè)單一的方法:
void afterPropertiesSet() throws Exception;
因此,可以簡(jiǎn)單地實(shí)現(xiàn)上述接口和初始化工作可以在里面afterPropertiesSet() 方法,如下所示:
public class ExampleBean implements InitializingBean { public void afterPropertiesSet() { // do some initialization work } }
在基于XML的配置元數(shù)據(jù)的情況下,可以使用init-method 屬性來(lái)指定具有void無(wú)參數(shù)簽名的方法的名稱(chēng)。例如:
<bean id="exampleBean" class="examples.ExampleBean" init-method="init"/>
下面是類(lèi)的定義:
public class ExampleBean { public void init() { // do some initialization work } }
銷(xiāo)毀回調(diào)
org.springframework.beans.factory.DisposableBean接口指定一個(gè)單一的方法:
void destroy() throws Exception;
因此,你可以簡(jiǎn)單地實(shí)現(xiàn)上述接口和定稿工作可以做里面的destroy() 方法,如下所示:
public class ExampleBean implements DisposableBean { public void destroy() { // do some destruction work } }
在基于XML的配置元數(shù)據(jù)的情況下,您可以使用destroy-method屬性來(lái)指定具有void無(wú)參數(shù)簽名的方法的名稱(chēng)。例如:
<bean id="exampleBean" class="examples.ExampleBean" destroy-method="destroy"/>
下面是類(lèi)的定義:
public class ExampleBean { public void destroy() { // do some destruction work } }
如果您在非web應(yīng)用環(huán)境中使用Spring的IoC容器,例如在桌面富客戶端環(huán)境; 注冊(cè)關(guān)閉鉤子在JVM中。這樣做可以確保正常關(guān)機(jī),并讓所有的資源都被釋放調(diào)用singleton bean上的相關(guān)destroy方法。
建議不要使用的InitializingBean或者DisposableBean的回調(diào),因?yàn)閄ML配置提供極大的靈活性在命名你的方法方面。
例如:
使用Eclipse IDE,然后按照下面的步驟來(lái)創(chuàng)建一個(gè)Spring應(yīng)用程序:
相關(guān)文章
JAVA 對(duì)象創(chuàng)建與對(duì)象克隆
這篇文章主要介紹了JAVA 對(duì)象創(chuàng)建與對(duì)象克隆,new 創(chuàng)建、反射、克隆、反序列化,克隆它分為深拷貝和淺拷貝,通過(guò)調(diào)用對(duì)象的 clone方法,進(jìn)行對(duì)象的克隆,下面來(lái)看看文章的詳細(xì)內(nèi)容吧2022-02-02Java中的Cglib動(dòng)態(tài)代理詳細(xì)解讀
這篇文章主要介紹了Java中的Cglib動(dòng)態(tài)代理詳細(xì)解讀,CGLib是一個(gè)強(qiáng)大的、高性能、高質(zhì)量的 Code 生成類(lèi)庫(kù),它可以在運(yùn)行期擴(kuò)展 Java 類(lèi)與實(shí)現(xiàn) Java 接口,需要的朋友可以參考下2023-11-11java根據(jù)List內(nèi)對(duì)象的屬性排序方法
下面小編就為大家分享一篇java根據(jù)List內(nèi)對(duì)象的屬性排序方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Java使用wait和notify實(shí)現(xiàn)線程之間的通信
Java 線程通信是將多個(gè)獨(dú)立的線程個(gè)體進(jìn)行關(guān)聯(lián)處理,使得線程與線程之間能進(jìn)行相互通信,下面這篇文章主要給大家介紹了關(guān)于Java使用wait和notify實(shí)現(xiàn)線程之間通信的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04詳解Servlet入門(mén)級(jí)設(shè)置(超詳細(xì) IDEA2020版)
這篇文章主要介紹了詳解Servlet入門(mén)級(jí)設(shè)置(超詳細(xì) IDEA2020版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11