1

我有一个叫做spring bean的Executor我需要这个执行器在两个类中注入一个是会话范围的,另一个是单例的,所以我使用@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. 然后我使用 WebParser 从 ExecutorService 获取进度并将其传回给用户以报告进度。

这在原型之前工作得很好,但 ExecutorService 是所有会话之一,

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

4

1 回答 1

0

你可以使用prototype范围。然后它将注入ExecutorBean 构建时的新实例。所以Executor在创建 bean 时开始它的生命周期。

scoped-proxy=target-class在你的 bean 周围创建CGLIB包装器。所以其他 bean 只持有对这个包装器的引用,并且具有正确范围的正确 bean 被动态注入到这个包装器中。

即,您的 bean 中没有保存非常旧的过期request scopedbean session scoped,可能是在创建会话时注入的。相反,每次创建新请求时都会注入当前请求的新 bean。通过这种方式,您可以从寿命较长的 bean 中访问寿命较短的 bean,即您的request scopedbean 中的session scopedbean。

于 2013-06-25T13:06:57.677 回答