Spring bean的幾個屬性:scope、init-method、destroy-method、depends-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作為首選項,否則異常。