2012-12-17 25 views
3

我有一个弹簧配置,我定义了数百个动作,扩展了MyAction。我有一个执行服务可以查找操作的池。我无法直接使用appContext,因为每个操作都有一个或多个执行服务将使用的“密钥”,并且池会削减该依赖关系。如何确保“池”bean获得所需的所有其他bean?

所以游泳池必须能够收集所有类型为MyAction的豆(或者说可以延伸到MyAction的豆类)。

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

如果我可以在@PostConstruct方法中调用它,但确保bean工厂已经在当时从配置中添加了每个bean,那将会很棒吗?

注:几乎所有的豆类都是@Lazy

回答

2

你可以通过构造函数中使用注入和传递您的CollectionMyAction

喜欢的东西

@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; } 
} 

春将创建集所有豆类小心,延伸MyAction

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

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

+0

这看起来很有希望。让我写一个测试用例。 –

+0

有没有办法创建这个bean而不进行组件扫描? –

+1

@AaronDigulla你说'Foo'?您可以通过xml“创建它”,并仍然使用构造函数的“@ Inject”或“@ Autowired”注释。 您仍然需要使用MyAction扫描类或在XML中声明它们。 另一个需求(您也需要'@ PostConstruct')在您的XML中激活注释配置扫描,如 。 –

1

尝试使用ListableBeanFactorythis。另外here是API文档。方法getBeansOfType具有参数allowEagerInit,它强制惰性对象的eager init。

+0

'allowEagerInit'会创建所有的bean还是只有'MyAction'类型的bean? –

+0

它可能会创建所有的bean来检查它们的类型。当然,它会创建使用工厂方法实例化的bean。 – partlov

相关问题