[英]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.