複数のクエリー頻度の解決方法


クエリの頻度が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つある場合は、問題は解決しません.
スプリングシートを手動で登録することで問題を解決できるが,自動注入依存関係においても種々の解決策がある.

解決策

  • @Autowiredフィールド名一致
  • @Qualifier->@Qualifier->空の名前一致
  • @プライマリマッチング
  • 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に直接空登録した場合にも使用します.
  • @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より高い.