次のクラスを検討してください。
public class MyBean {
private A a;
@Autowired(required=true)
public void setA(A a) {
this.a = a;
}
public A getA() {
return a;
}
}
たとえば、Spring がインジェクションの候補を 1 つも見つけられない場合など、autowired インジェクションをオーバーライドする必要がある場合があります。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 構成を使用しなければならないケースですか?
ありがとう、アンドレア・ポルチ
更新 2 つのソリューション (名前によるインジェクションと @Primary の使用) に感謝しますが、それらは私のユース ケースを解決しないため、より具体的に説明する必要があると思います。
私のユースケースでは、 MyBean クラスは外部ライブラリから取得されるため、変更はできません。また、MyBean の複数のインスタンスが必要で、それぞれが A インターフェースの異なるインスタンスを注入します。これを反映するために上記のコードを更新しました (xml と Java の両方)。
Java configを使用した解決策はありますか? MyBean への依存関係の自動配線を回避することは可能ですか? (そのクラスの Bean でのみ、コンテキスト内のすべての Bean の自動配線を完全に無効にしないでください)