簡體   English   中英

Spring作用域實例變量的用法

[英]Spring scope usage for instance variables

我們正在實現spring服務,@ Webservice層是單例,它稱為原型的“ Service”層。 Service層具有很多實例變量,因此,認為使其成為原型將是理想的選擇,但是,由於@Webservice層是單例,因此看起來該原型僅被實例化了一次。

什么類型的@Scope對我們有用? 服務層上有很多實例變量,由於很多代碼需要更改,因此很難將它們設置為方法的局部變量。

如果我將所有層都設為單例,那么兩個線程是否共享實例變量?

給定具有注入目標的單例bean,Spring將初始化該bean並立即注入field / method / constructor。 如果該注入目標是原型Bean,則Spring只會執行一次。

大概,您希望在單例處理的每個動作或事件上都有一個新的原型bean。 您將需要一個AOP范圍的代理。 在有關作用域代理和依賴項的Spring章節中對此進行了記錄。 使用配置的作用域代理,Spring將注入一個代理而不是原型bean。

代理本身會將對它的所有調用委派給原型Bean,每次都是一個新實例。

通過注釋配置,您可以使用以下命令配置@Bean@Component

@Scope(scopeName = BeanDefinition.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)

這告訴Spring用代理配置bean,該代理將繼承目標的實際類類型並成為原型。

然后注入時

@Autowired
private MyPrototypeBean bean;

bean將保存對代理對象的引用。 然后可以調用方法

bean.method();

這將委派給一個新實例。 這意味着每次通話

bean.method();
bean.method();
bean.method();

將操作一個新實例,在上面的示例中將操作三個新實例。 如果只希望一個實例調用這些方法,則可以從代理中提取它。 請參閱此處提供的解決方案

MyPrototypeBean target = null;
if (AopUtils.isJdkDynamicProxy(proxy)) {
    target = (MyPrototypeBean) ((Advised)proxy).getTargetSource().getTarget();
} // won't work for CGLIB classes AFAIK (gotta search)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM