私は現在、多少のように、春のJavaの設定クラスを介して注入相互に依存するサービスを、持っているアプリケーションに取り組んでいます:春 - Javaの設定クラスの中ジェクトコンストラクタの引数
@Configuration
public class ExampleConfiguration {
@Bean
public IFirstService firstService() {
return new FirstServiceImpl();
}
@Bean
public ISecondService secondService() {
return new SecondServiceImpl();
}
}
@Service
public class FirstServiceImpl implements IFirstService{
...
}
@Service
public class SecondServiceImpl implements ISecondService{
@Inject
private IFirstService firstService;
...
}
これはと、意図したとおりに働いていますアプリケーション全体で作成され注入される各サービスの単一のインスタンス。しかし、私はコンストラクタインジェクションに変換することに興味があります。ユニット/模擬テストパターンのサポートが向上するようです。
@Service
public class SecondServiceImpl implements ISecondService {
private IFirstService firstService;
@Inject
public SecondServiceImpl(IFirstService firstService){
this.firstService = firstService;
}
...
}
私は、これは/は、上記構成のクラスと連携どのように相互作用するかを決定されるに実行している問題:私はそれを理解したように、このようなものにSecondServiceImplコードを変更します。
@Configuration
public class ExampleConfiguration {
@Bean
public IFirstService firstService() {
return new FirstServiceImpl();
}
@Bean
public ISecondService secondService() {
return new SecondServiceImpl(firstService());
}
}
しかし、それは、アプリケーション全体に注入IFirstServiceの1つのインスタンスが存在すべきであるという考えを台無しにしてしまうようfirstService()
への各呼び出しは新しいをインスタンス化するので、これは、ようだ:私はのようにこれを行う何かを見てきたすべての例IFirstServiceインスタンス。
Springがそのようなことを処理する方法や、依存関係の注入について間違っているかどうかについて詳しく知りませんか?任意の提案をいただければ幸いです!
EDIT:
受け入れ答えが正しいですが、私は最近、これを行うには、より堅牢な方法がある発見した - あなたは@Bean
アノテーションを付けるメソッドのパラメータとして必要な項目を指定することができ、そしてそれは意志同一または他の利用可能な構成から注射することができる。そう上記なる:
@Configuration
public class ExampleConfiguration {
@Bean
public IFirstService firstService() {
return new FirstServiceImpl();
}
@Bean
public ISecondService secondService(IFirstService firstService) {
return new SecondServiceImpl(firstService);
}
}
特定のBean IDが必要な場合@Qualifier
注釈は、メンバーパラメータでインラインで使用することができる。なお
JSR-330の修飾子がパラメータ – romeara
で使用できなかったため、名前付き注釈を使用していただきありがとうございます - 私は春の注釈を使用せずにそのようなものを修飾する方法を知りました。私はこれを答えとして使用することを願っています:) –