繁体   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