自動注入[TIL]依存


多様な依存関係注入方法


インプラント作成者

  • 作成者を介して依存関係を注入する方法
  • コンストラクション関数呼び出し時に1回だけ呼び出すことを保証
  • 不便、必要な依存関係に使用
  • @Component
    public class OrderServiceImpl implements OrderService {
    	private final MemberRepository memberRepository;
        private final DiscountPolicy discouontPolicy;
        
        @Autowired	// 생성자가 1개만 있는 경우는 생략 가능
        public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy) {
        	this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
        }
    }

    注入モディファイヤ(setter注入)

  • setterが依存関係をどのように注入するか
  • 選択、変更可能な依存関係
  • @Component
    public class OrderServiceImpl implements OrderService {
    	private MemberRepository memberRepository;
        private DiscountPolicy discouontPolicy;
        
        @Autowired
        public void setMemberRepository(MemberRepository memberRepository) {
        	this.memberRepository = memberRepository;
        }
        
        @Autowired
        public void setDiscountPolicy(DiscountPolicy discountPolicy) {
        	this.discountPolicy = discountPolicy;
        }
    }

    げんばちゅうにゅう

  • ダイレクトインジェクションフィールド
  • 外部での変更ができないため、テストが困難です.
  • @Component
    public class OrderServiceImpl implements OrderService {
    	
        @Autowired
        private MemberRepository memberRepository;
        @Autowired
        private DiscountPolicy discountPolicy;
    }

    従来のメソッド注入

  • 従来の方法で注入
  • 一度に複数のフィールドを入力できます.
  • 通常はあまり使いにくいです.
  • @Component
    public class OrderServiceImpl implements OrderService {
    	
        private MemberRepository memberRepository;
        private DiscountPolicy discountPolicy;
        
        @Autowired
        public void init(MemberRepository memberRepository, DiscountRepository discountRepository) {
        	this.memberRepository = memberRepository;
            this.discountPolicy = discountPolicy;
        }
    }
    整理する생성자 주입方式
  • 多くの場合、依存関係はアプリケーションが閉じるまで変更されません.
  • 機能キー注入の欠点は、方法を開示しなければならないことである
  • 2つ以上の空のクエリ

    @Autowiredタイプ別クエリー.
    問題が発生した場合
    @Component
    public class FixDiscountPolicy implements DiscountPolicy {}
    
    @Component
    public class RateDiscountPolicy implements DiscountPolicy {}
    
    @Autowired
    private DiscountPolicy discountPolicy;
    NoUniqueBeanDefinitionExceptionオカレンス
    解決策を理解してください.

    一致@Autowiredフィールド名

  • タイプマッチング
  • タイプマッチング結果が2つを超える場合、フィールド名は
  • // 변경 전
    @Autowired
    private DiscountPolicy discountPolicy
    
    // 필드 명을 빈 이름으로 변경 후
    @Autowired
    private DiscountPolicy rateDisountPolicy

    @Qualifierの使用

  • @Qualifierマッチング
  • Null Name Matching
  • NoSuchBeanDefinitionException具体値
  • 空の付録@Qualifierを貼り付けます.
    @Component
    @Qualifier("mainDiscountPolicy")
    public class RateDiscountPolicy implements DiscountPolicy {}
    記入する場合は、@Qualifierと明記し、登録名を記入してください.
    // 생성자 자동 주입 예시
    @Autowired
    public OrderServiceImpl(MemberRepository memberRepository, 
    						@Qualifier("mainDiscountPolicy") DiscountPolicy discountPolicy) {
    	this.memberRepository = memberRepository;
        this.discountPolicy = discountPolicy;
    }

    @Primaryの使用

    // rateDiscountPolicy가 우선권을 갖는다.
    @Component
    @Primary
    public class RateDiscountPolicy implements DiscountPolicy {}
    
    @Component
    public class FixDiscountPolicy implements DiscountPolicy {}