Java中bean的作用域
java開發者都會在實體對象的屬性中加上private關鍵字,而在業務類對外發放的方法中寫上public關鍵字,這并不是習慣,而是開發者深諳其道,這就是java對象中filed的作用域。
舉個例子,你家里的東西,都屬于你家的,家門前的路是屬于你和鄰居們的,你爸爸的剃須刀是屬于你爸爸的;這就是作用域,分清對象歸屬權限的作用。
而在spring容器所管理的組件,也是有作用域的。本章將會詳細闡述bean的作用域,以及其和ApplicationContext、bean和beanFactory絲絲縷縷的聯系。
俗話說,授之于魚不如授之以漁,我們還是通過源碼來學習,希望在這個過程大家都能夠有所提升。
@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值上方的注釋告訴我們,當前有四個值:(高級版本更新了global session)
SCOPE_SINGLETON,SCOPE_PROTOTYPE,SCOPE_REQUEST,SCOPE_SESSION,下面分別來看看,這些作用域,有什么不同。
SCOPE_SINGLETON
從源碼中可以看到,該作用域是spring默認的作用域。`singleton`想必大家都非常熟悉,沒錯,學習設計模式的時候第一個介紹的應該就是單例模式,也就是說,spring中的bean,默認情況下都是單例。復習下什么是單例:在應用中,有且只有一個實例。通過之前的bean管理的學習([《spring源碼閱讀2-2——bean的管理》](http://www.jianshu.com/p/3c225fc067a0)),我們知道容器中的單例都會被注冊到spring容器中的緩存中,回顧下:
容器中的緩存對象
這回可以動態運行demo代碼,證實下spring容器對于bean的管理。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%