Zeu*_*eus 3 java spring web-services spring-mvc
我们正在实现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)
Run Code Online (Sandbox Code Playgroud)
这告诉Spring使用代理来配置Bean,该代理将继承目标的实际类类型并成为原型。
然后注入时
@Autowired
private MyPrototypeBean bean;
Run Code Online (Sandbox Code Playgroud)
bean将保存对代理对象的引用。然后可以调用方法
bean.method();
Run Code Online (Sandbox Code Playgroud)
这将委派给一个新实例。这意味着每次通话
bean.method();
bean.method();
bean.method();
Run Code Online (Sandbox Code Playgroud)
将操作一个新实例,在上面的示例中将操作三个新实例。如果只希望一个实例调用这些方法,则可以从代理中提取它。请参阅此处提供的解决方案
MyPrototypeBean target = null;
if (AopUtils.isJdkDynamicProxy(proxy)) {
target = (MyPrototypeBean) ((Advised)proxy).getTargetSource().getTarget();
} // won't work for CGLIB classes AFAIK (gotta search)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2208 次 |
| 最近记录: |