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