使用getBean()和构造函数args,多个应用程序上下文的问题

时间:2013-12-03 17:13:52

标签: java spring spring-annotations

我刚开始使用弹簧,正在开发一个使用多个应用程序上下文的应用程序,使用注释进行配置。

我有一个上下文,我正在创建3个单例bean,其中一个我想作为参数传递给原型bean的工厂方法,它将存在于不同的应用程序上下文中。

此其他应用程序上下文创建为此原始上下文中的单个bean之一。

我看到的问题是,在我尝试使用getBean()创建另一个存在于第二个上下文中的bean时(参见下面的'someBean()'工厂方法),我得到了一个框架中的例外:

  

在类中定义名为'someBean'的bean时出错   org.imaginary.SpringAppDependencyConfiguration:bean的实例化   失败;嵌套异常是......不满意   依赖性通过构造函数参数表示,索引为0   [org.imaginary.ISomeDependency] ::没有类型的限定bean   找到依赖的[org.imaginary.ISomeDependency]:期望在   至少有1个bean有资格作为autowire候选者   依赖性。

我在这里举起了什么?

原始上下文的配置如下:

@Configuration
public class SpringAppDependencyConfiguration
{
    @Autowired
    private ISomeDependency someDependency;

    @Autowired
    private AnnotationConfigApplicationContext otherSpringContext;

    @Bean(destroyMethod="close")
    public ISomeDependency someDependency()
    {
        return new SomeDependencyImpl( 13 );
    }

    @Bean (destroyMethod="close")
    public AnnotationConfigApplicationContext otherSpringContext()
    {
        return new AnnotationConfigApplicationContext(OtherContextDependencyConfiguration.class);
    }

    @Bean
    @DependsOn( { "otherSpringContext", "someDependency" } )
    public ISomeBean someBean() throws Exception
    {
        if ( !otherSpringContext.getBeansOfType( ISomeOtherBean.class ).containsKey( "SomeOtherBean" ) )
        {
            throw new Exception("SpringAppDependencyConfiguration.someBean(): " +
            "unable to find SomeOtherBean implementation");
        }

        ISomeOtherBean someOtherBean = (ISomeOtherBean) otherSpringContext.getBean( "SomeOtherBean", someDependency );

        return new SomeBeanImpl( someDependency, someOtherBean );
    }

}

其他应用程序上下文的配置如下所示:

@Configuration
public class OtherContextDependencyConfiguration
{
    @Bean
    @Scope("prototype")
    public ISomeOtherBean someOtherBean(ISomeDependency theDependency) throws Exception
    {
         return new SomeOtherBeanImpl(theDependency);
    }
}

1 个答案:

答案 0 :(得分:0)

所以,我想我学到了一种可以获得我想要的结果的方法是创建第二个上下文,以便将初始上下文视为父级。

为了支持这个需要一个不同的类概念组织,所以我会尝试使用我当前的方法发布一个更新到这个问题,一旦我有一个易于理解的版本。