Spring bean的初始化及銷毀


Spring bean的幾個屬性:scopeinit-methoddestroy-methoddepends-on等。

 

Scope

在Spring容器中是指其創建的Bean對象相對於其他Bean對象的請求可見范圍。

scope分類:singleton, prototype, request, session, global session。

這里的singleton和設計模式里面的單例模式不一樣,標記為singleton的bean是由容器來保證這種類型的bean在同一個容器內只存在一個共享實例,而單例模式則是保證在同一個Classloader中只存在一個這種類型的實例。

 

 

init-method

是指創建bean時調用的方法,注意,不是創建bean的方法。

destroy-method

是指銷毀bean時調用的方法,同樣,不是銷毀bean的方法。

 

注意:scope為prototype的bean,容器會將創建好的對象實例返回給請求方,之后,容器就不再擁有其引用請求方需要自己負責當前對象后繼生命周期的管理工作,包括該對象的銷毀

所以:scope為singleton的bean的destroy方法則是在容器關閉時執行,而scope為prototype的bean是不會執行destroy方法的。

 

depends-on

用於指定bean初始化及銷毀時的順序。注意上面的結論

<bean id="helloApi" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/>
<bean id="decorator" 
class="cn.javass.spring.chapter3.bean.HelloApiDecorator" depends-on="helloApi">
<property name="helloApi"><ref bean="helloApi"/></property>
</bean>

“decorator”指定了“depends-on”屬性為“helloApi”,所以在“decorator”Bean初始化之前要先初始化“helloApi”而在銷毀“helloApi”之前先要銷毀“decorator”,大家注意一下銷毀順序。

 

Spring 允許 Bean 在初始化完成以及銷毀執行特定的操作。下面是常用的三種指定特定操作的方法:

    通過實現 InitializingBean / DisposableBean 接口;
    通過<bean> 元素的 init-method / destroy-method屬性;
    通過@PostConstruct或@PreDestroy注解。

Bean在實例化的過程中:Constructor > @PostConstruct >InitializingBean > init-method

Bean在銷毀的過程中:@PreDestroy > DisposableBean > destroy-method

 

參考:

Spring bean 的init-method和destroy-method
Spring容器中的Bean幾種初始化方法和銷毀方法的先后順序
Spring scope屬性詳解

 

----------------------------------------------------------

可以和@Component一起使用的注解:

@Lazy(true) -- 延遲初始化

@DependsOn({"managedBean"}) --  初始化及銷毀時的順序

@Qualifier -- 見 Spring 依賴注入(DI)的注解

@Primary -- 當有多個候選時,被注解的bean作為首選項,否則異常。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM