我有一个名为Executor
的spring bean我需要这个执行器被注入两个类,一个是会话作用域,另一个是单例,所以我使用@Autowired
注释将它注入两者,它的工作原理非常好,但对于会话bean,执行者只对所有会话都有一个,我理解这是它应该如何工作。
如何让执行程序获取其注入的bean的范围?现在我所能做的就是为每个人使用两个不同的类。
我无法理解设置属性scoped-proxy
的效果
<context-component-scan />
至targetClass
。
修改
这是我试用的原型范围:
假设这是我的会话soped bean
@Component
@Scope("session")
public class WebExecutor(){
@Autowired
private ExecutorService executor;
@Async
public void startCalc(){
executor.start("now");
}
}
这是我的ExecutorService类
@Component
@Scope("prototype")
public class ExecutorService{
private int progress;
public void start(String when){
//do some stuff and increment the progress
}
//getter and setter for progress
}
我还有另一个具有默认单例范围的组件,它也会对执行程序进行自动装配,因此执行程序不能是会话范围的。
所以现在我需要一个类才能拥有自动装配的bean的范围,所以我尝试了原型范围。
这应该如何在Web版本中起作用
WebExecutor
这在原型之前运行良好,但ExecutorService是所有会话的一个,
所以我使用了原型,但现在进度始终为0,当我调试Executor时,我发现它正在递增但是WebExecutor无法看到增量。
答案 0 :(得分:0)
你可以使用prototype
范围。然后,当构造Bean时,它将注入Executor
的新实例。因此Executor
在创建bean时开始其生命周期。
scoped-proxy=target-class
在您的bean周围创建CGLIB
包装器。因此,其他bean仅保留对此包装器的引用,并且具有正确范围的正确bean将动态注入此包装器。
即。您没有在request scoped
bean中保存非常旧的过期session scoped
bean,可能是在创建会话时注入的。而是每次创建新请求时注入当前请求的新bean。通过这种方式,您可以使用寿命较长的bean(即request scoped
bean中的session scoped
bean)访问寿命较短的bean。