3

我有一个 spring 配置,我在其中定义了数百个扩展的操作MyAction。我有一个池,执行服务可以在其中查找操作。我不能直接使用 appContext,因为每个操作都有一个或多个“键”,执行服务将使用这些“键”,并且池会减少这种依赖关系。

所以池必须能够收集所有类型的bean MyAction(或者更确切地说是扩展的bean MyAction)。

该方法ApplicationContext.getBeansOfType()似乎可以满足我的需要,但是我什么时候可以安全地调用它?

如果我可以在一个方法中调用它会很棒,@PostConstruct但它是否保证 bean 工厂已经看到当时从配置中添加了每个 bean?

注意:几乎我所有的豆子都是@Lazy

4

2 回答 2

2

您可以通过构造函数使用注入并传递Collection您的MyAction

就像是

 @Component
 public class Foo {
     private final Set<MyAction> myActions;

     @Inject
     public Foo(Set<MyAction> myActions) { this.myActions = myActions; }
 }

或者

 public class Foo {
     private Set<MyAction> myActions;

     @Inject
     public void setMyActions(Set<MyAction> myActions) { this.myActions = myActions; }
 }

Spring 将负责创建包含所有扩展的 bean 的集合MyAction

在第一种情况下,它们是由构造函数注入的,您可以在任何方法中安全地使用它们。

在第二种情况下,Spring 最终会调用 setter。您可以在 setter 中进行任何后期处理,也可以添加@PostConstruct适用于myActions.

于 2013-01-09T13:44:38.293 回答
1

尝试ListableBeanFactory这样使用。这里还有API 文档。方法getBeansOfType具有allowEagerInit强制惰性对象急切初始化的参数。

于 2013-01-09T13:41:02.877 回答