Java中bean的作用域
java開發(fā)者都會在實體對象的屬性中加上private關(guān)鍵字,而在業(yè)務(wù)類對外發(fā)放的方法中寫上public關(guān)鍵字,這并不是習(xí)慣,而是開發(fā)者深諳其道,這就是java對象中filed的作用域。
舉個例子,你家里的東西,都屬于你家的,家門前的路是屬于你和鄰居們的,你爸爸的剃須刀是屬于你爸爸的;這就是作用域,分清對象歸屬權(quán)限的作用。
而在spring容器所管理的組件,也是有作用域的。本章將會詳細闡述bean的作用域,以及其和ApplicationContext、bean和beanFactory絲絲縷縷的聯(lián)系。
俗話說,授之于魚不如授之以漁,我們還是通過源碼來學(xué)習(xí),希望在這個過程大家都能夠有所提升。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {
/**
* Specifies the scope to use for the annotated component/bean.
* @see ConfigurableBeanFactory#SCOPE_SINGLETON
* @see ConfigurableBeanFactory#SCOPE_PROTOTYPE
* @see org.springframework.web.context.WebApplicationContext#SCOPE_REQUEST
* @see org.springframework.web.context.WebApplicationContext#SCOPE_SESSION
*/
String value() default ConfigurableBeanFactory.SCOPE_SINGLETON;
/**
* Specifies whether a component should be configured as a scoped proxy
* and if so, whether the proxy should be interface-based or subclass-based.
* 《p》Defaults to {@link ScopedProxyMode#NO}, indicating that no scoped
* proxy should be created.
* 《p》Analogous to {@code 《aop:scoped-proxy/》} support in Spring XML.
*/
ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;
}
在spring容器中,@Scope注解來聲明實例的作用域,在源碼中的注釋中有這樣一句話In this context, scope means the lifecycle of an instance。scope決定了實例的整個生命周期。
Scope注解的value值上方的注釋告訴我們,當(dāng)前有四個值:(高級版本更新了global session)
SCOPE_SINGLETON,SCOPE_PROTOTYPE,SCOPE_REQUEST,SCOPE_SESSION,下面分別來看看,這些作用域,有什么不同。
SCOPE_SINGLETON
從源碼中可以看到,該作用域是spring默認的作用域。`singleton`想必大家都非常熟悉,沒錯,學(xué)習(xí)設(shè)計模式的時候第一個介紹的應(yīng)該就是單例模式,也就是說,spring中的bean,默認情況下都是單例。復(fù)習(xí)下什么是單例:在應(yīng)用中,有且只有一個實例。通過之前的bean管理的學(xué)習(xí)([《spring源碼閱讀2-2——bean的管理》](http://www.jianshu.com/p/3c225fc067a0)),我們知道容器中的單例都會被注冊到spring容器中的緩存中,回顧下:
容器中的緩存對象
這回可以動態(tài)運行demo代碼,證實下spring容器對于bean的管理。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%