@Autowiredフィールド名,@Qualifier,@Primary

2541 ワード

2つ以上のクエリー・ターゲットの空の解決方法
  • @Autowiredフィールド名一致
  • @Qualifier->@Qualifier->空の名前一致
  • @Primary,
  • 1.@Autowiredフィールド名の一致
  • @Autowiredはタイプマッチングを試み、複数の空がある場合はフィールド名、パラメータ名を使用して空の名前を追加します.
  • 既存のコード
    @Autowired
    private DiscountPolicy discountPoilicy
    フィールド名を空の名前に変更
    privat DiscountPolicy rateDiscountPolicy
  • フィールド名はrateDiscountPolicyであるため、正常に入力されます.
  • フィールド名マッチングは、まずタイプマッチングを試み、結果に複数のスペースがある場合に動作する機能です.
  • @Autowired照合の消去
  • タイプマッチング
  • タイプマッチング結果が2つを超える場合、空の名前をフィールド名
  • にマッチングする.
    @Qualifierの使用
  • @Qualifierは区切り記号を付加する方法です.
  • 注入では、空の名前を変更するのではなく、追加の方法が提供されます.
  • 空の登録時に@Qualifierを貼り付けます.
    @Component
    @Qualifier("mainDiscountPolicy")
    public class RateDiscountPolicy implements DiscountPolicy {}
    @Component
    public class OrderServiceImpl implements OrderService {
    
        private final MemberRepository memberRepository;
        private final DiscountPolicy discountPolicy;
    
        public OrderServiceImpl(MemberRepository memberRepository, @Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
            this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
        }
    }
  • @Qualifierは@Qualifierを検索するためにのみ使用されていることが明確で、良いです.
  • @Primaryの使用
  • @Primaryは優先度を決定する方法です.
  • @Component
    @Primary
    public class RateDiscountPolicy implements DiscountPolicy {}
  • @Autowiredの場合、複数の空が一致する場合、@Primaryに優先度があります.
  • 独自のAnnotationを作成
  • @Qualifierはコンパイル時にタイプをチェックできません.この時はアニメーションを作って解決することができます.
  • @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Qualifier("mainDiscountPolicy")
    public @interface MainDiscountPolicy {
    }
     
    @Component
    public class OrderServiceImpl implements OrderService {
    
        private final MemberRepository memberRepository;
        private final DiscountPolicy discountPolicy;
        
        // @Qualifier With Annotation
        public OrderServiceImpl(MemberRepository memberRepository, @MainDiscountPolicy DiscountPolicy discountPolicy) {
            this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
        }
  • 明細書には継承されていない概念がある.
  • のような複数のプレゼンテーションを統合した機能はspringがサポートする機能である.
  • @Qualifierだけでなく、他のプレゼンテーションを組み合わせて使用することもできます.