Spring 3.X.Xを使用する2つのサービスに@Primaryというアノテーションが付けられており、別の設定クラスを作成しました。SpringはBeanの設定を「プライマリ」に設定します。
何らかの理由で、構成クラスのデバッグ中に無視されますが、正しい依存関係が得られることがわかりますが、使用するときに間違ったものが設定されています。
インタフェースはFoo::
@Primary
@Service("FooImpl")
public class FooImpl implements Foo {
private String message = "fooDefaultMessage";
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
バーインターフェース:ハードコードデフォルトメッセージと
public interface Foo {
String getMessage();
}
プライマリ実装
が、私はそれが簡単にコードを説明することを見つける、ここでの例です:
public interface Bar {
void doBar();
}
バーのデフォルトの実装:
@Primary
@Service("BarImpl")
public class BarImpl implements Bar {
private Foo foo;
@Override
public void doBar() {
System.out.println(foo.getMessage());
}
public Foo getFoo() {
return foo;
}
@Autowired
public void setFoo(Foo foo) {
this.foo = foo;
}
}
これまでのところは良い、私は予想通り、私はすべてを取得バーを注入したい場合。事は、私は次のように設定を持っている:
@Configuration
public class BeanConfiguration {
@Bean
@Qualifier("readOnlyFoo")
Foo readOnlyFoo() {
FooImpl foo = new FooImpl();
foo.setMessage("a read only message");
return foo;
}
@Bean
@Qualifier("readOnlyBar")
Bar readOnlyBar() {
BarImpl bar = new BarImpl();
bar.setFoo(readOnlyFoo());
return bar;
}
}
私はデフォルトのFooの代わりに、ここで設定1を取得していますreadOnlyBarを注入する場合。
private Bar readOnlyBar;
@Autowired
@Qualifier("readOnlyBar")
public void setReadOnlyBar(Bar readOnlyBar) {
this.readOnlyBar = readOnlyBar;
}
...
readOnlyBar.doBar();
"fooDefaultMessage"でFoo Beanを持っていますか?何故ですか? Springが@Configurationで設定したBeanを使用していることを確認するにはどうすればよいですか?事前に
おかげで、
EDIT:ノート代わりに@Configurationクラスの読み取り専用()メソッドを呼び出すことで、あなたが@Qualified引数を渡すと同じことが起こるということ。すなわち:
@Configuration
public class BeanConfiguration {
@Bean
@Qualifier("readOnlyFoo")
Foo readOnlyFoo() {
FooImpl foo = new FooImpl();
foo.setMessage("a read only message");
return foo;
}
@Bean
@Qualifier("readOnlyBar")
Bar readOnlyBar(@Qualifier("readOnlyFoo") Foo readOnlyFoo) {
BarImpl bar = new BarImpl();
bar.setFoo(readOnlyFoo);
return bar;
}
}
私は私が/欲しい期待するが、残念ながら、私はそれを使用することはできませんとしてすべての作品コンストラクタ依存性注入を使用してみてください代わりに場合。
プロファイルを使用できませんか? –
ここでプロファイルがどのように役立つか分かりません。はい、既定の実装を使用するプロファイルと読み込み専用のプロファイルを指すプロファイルを持つことができます。問題は、読み取り専用の新しい(読み取り専用の)Beanをインスタンス化する読み取り専用インスタンスをデフォルトから設定する方法です。 – void