Spring bean作为其自动装配的bean的类

时间:2013-06-25 12:48:14

标签: spring spring-mvc scope javabeans

我有一个名为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版本中起作用

  1. 您单击开始执行的链接,该链接调用WebExecutor
  2. 的方法开头
  3. 然后,我使用WebParser从ExecutorService获取进度,并将其传递给用户以报告进度。
  4. 这在原型之前运行良好,但ExecutorService是所有会话的一个,

    所以我使用了原型,但现在进度始终为0,当我调试Executor时,我发现它正在递增但是WebExecutor无法看到增量。

1 个答案:

答案 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。