複数のクエリー頻度の解決方法
クエリの頻度が2つを超える場合
@Autowiredはタイプ別にクエリーされますが、同じタイプの空が2つ以上ある場合は問題が発生します.
たとえば、DiscountPolicyの実装チェーンFixDiscountPolicyとRateDiscountPolicyはSpringBinとして宣言されます.
@Component
public class FixDiscountPolicy implements DiscountPolicy {}
@Component
public class RateDiscountPolicy implements DiscountPolicy {}
@Autowiredを使用して依存関係を自動的に注入します.@Autowired private DiscountPolicy discountPolicy;
NoUniqueBeanDefinitionException
エラーが発生し、詳細ヒントが2つ空いています.この場合、サブタイプとして指定できますが、サブタイプとして指定することはDIPの原則に反し(ロールに依存せず、具体的に依存せず)、柔軟性も劣ります.また、名称が異なるだけで、まったく同じタイプのスプリングシートが2つある場合は、問題は解決しません.
スプリングシートを手動で登録することで問題を解決できるが,自動注入依存関係においても種々の解決策がある.
解決策
1.@Autowiredフィールド名の一致
@Autowiredはタイプを照合しようとします.複数の空がある場合は、フィールド名、パラメータ名を使用してスプリング空の名前を追加します.
@Autowired private DiscountPolicy rateDiscountPolicy;
フィールド名はrateDiscountPolicyであるため,依存関係は正常に注入される.フィールド名マッチングは、まずタイプマッチングを試み、結果に複数の空きがある場合に操作する機能です.2.@Qualifierを使用
@Qualifierは、入力時に追加のメソッドを提供しますが、空の名前は変更されません.
@Component
@Qualifier("fixDiscountPolicy")
public class FixDiscountPolicy implements DiscountPolicy {}
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("fixDiscountPolicy") DiscountPolicy discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Autowired
public DiscountPolicy setDiscountPolicy(@Qualifier("fixDiscountPolicy") DiscountPolicy discountPolicy) {
retrun discountPolicy;
}
@Bean
@Qualifier("fixDiscountPolicy")
public DiscontPolicy discountPolicy() {...}
@Qualifierと入力したときに@Qualifier(「fixDiscountPolicy」)が見つからない場合は、fixDiscountPolicyという名前のspring binをさらに検索します.ない場合は、NoSuchBeanDefinitionException
エラーが発生します.ただし,@Qualifierは@Qualifierの検索にのみ使用することが望ましい.
3. @Primary
@Primaryは優先度を決定する方法であり、@Autowiredで複数の空が一致する場合、@Primaryは優先度を有します.DiscountPolicyのインプリメンテーションにRateDiscountPolicyが優先権を付与されると、そのインプリメンテーションクラスに注入される.
@Qualifierと@Primary
スプリングの詳細は常に優先されるため、非常に詳細な@Qualifierを実行する優先度は@Primaryより高い.
Reference
この問題について(複数のクエリー頻度の解決方法), 我々は、より多くの情報をここで見つけました https://velog.io/@mardi2020/조회-빈이-여러개일-경우-해결-방법テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol