Я новичок в 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);
}
}