Проблемы с использованием getBean() с аргументами конструктора, несколькими контекстами приложения

Я новичок в Spring и работаю над приложением, которое использует несколько контекстов приложений, настроенных с использованием аннотации.

У меня есть один контекст, в котором я создаю 3 одноэлементных компонента, один из которых я хочу передать в качестве аргумента в фабричный метод для прототипа компонента, который будет жить в другом контексте приложения.

Этот другой контекст приложения создается как один из одноэлементных компонентов в этом исходном контексте.

Проблема, которую я вижу, заключается в том, что в момент, когда я пытаюсь использовать getBean() для создания этого другого bean-компонента, который живет в этом втором контексте (см. фабричный метод someBean() ниже), я получаю исключение из рамки:

Ошибка создания bean-компонента с именем «someBean», определенным в классе 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);
    }
}

person Hoobajoob    schedule 03.12.2013    source источник
comment
У вас действительно есть несколько контекстов или просто несколько файлов конфигурации, потому что есть разница.   -  person bh5k    schedule 03.12.2013
comment
Несколько контекстов — если вы посмотрите на первый класс конфигурации, вы увидите, где второй контекст создается с использованием второго класса конфигурации — это bean-компонент в первом контексте (см. фабричный метод otherSpringContext).   -  person Hoobajoob    schedule 03.12.2013


Ответы (1)


Итак, я думаю, что понял, что один из способов получить искомый результат — создать этот второй контекст таким образом, чтобы он рассматривал первоначальный контекст как родительский.

Для поддержки этого потребовалась другая концептуальная организация классов, поэтому я попытаюсь опубликовать обновление этого вопроса с моим текущим подходом, как только у меня будет его удобоваримая версия.

person Hoobajoob    schedule 03.12.2013