Рассмотрим следующий класс:
public class MyBean {
private A a;
@Autowired(required=true)
public void setA(A a) {
this.a = a;
}
public A getA() {
return a;
}
}
Бывают случаи, когда нужно переопределить автоматическую инъекцию, например, когда Spring не может найти ни одного кандидата на инъекцию. В XML у меня может быть следующий пример:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="first" class="my.pkg.AImpl"/>
<bean id="second" class="my.pkg.AImpl"/>
<bean id="myBeanFirst" class="my.pkg.MyBean">
<property name="a" ref="first"/>
</bean>
<bean id="myBeanSecond" class="my.pkg.MyBean">
<property name="a" ref="second"/>
</bean>
</beans>
Есть ли способ сделать то же самое с Java Config? Следующее не работает (и я понимаю, почему), потому что Spring пытается автоматически связать свойство после возврата из метода myBean, и оно завершается с ошибкой NoUniqueBeanDefinitionException:
@Configuration
public class MyConfig {
@Bean
public A first() {
return new AImpl();
}
@Bean
public A second() {
return new AImpl();
}
@Bean
public MyBean myBeanFirst(A first) {
MyBean myBean = new MyBean();
myBean.setA(first);
return myBean;
}
@Bean
public MyBean myBeanSecond(A second) {
MyBean myBean = new MyBean();
myBean.setA(first);
return myBean;
}
}
Модифицировать класс MyBean не всегда возможно, например, потому что он получен из внешней библиотеки. Это тот случай, когда я должен использовать XML-конфигурацию?
Спасибо, Андреа Польчи.
Обновление Спасибо за два решения (внедрение по имени и использование @Primary), но они не решают мой вариант использования, поэтому, я думаю, мне нужно быть более конкретным.
В моем случае класс MyBean исходит из внешней библиотеки, поэтому какие-либо изменения в нем невозможны. Мне также нужно иметь более одного экземпляра MyBean, каждый из которых внедряет разные экземпляры интерфейса A. Я обновил приведенный выше код, чтобы отразить это (как xml, так и java).
Есть ли какое-либо решение с использованием конфигурации Java? Можно ли избежать автопривязки зависимости от MyBean? (Только для bean-компонентов этого класса, не отключая автопроводку полностью для каждого bean-компонента в контексте)