SpringBootサービスにRepositoryを注入

5970 ワード

!!! 勉強のために書いたブログ.不足点についてご提案いただき、感謝に堪えません.
Service ClassにResponsitory Classを注入する方法を理解するために、学習を目的としています.
@Service
@Transactional(readOnly = true): 
public class MemberService {

    // field injection
    @Autowired
    private MemberRepository memberRepository;
 }
上記のコードは通常よく使われるコードフォーマットです.しかし、いくつかの欠点もあります.基本的には変更不可なので.テスト中にrepositoryを変更する必要がある場合がありますが、現在のコードは使用できません.
だからこの問題を解決するためにsetter注入も使います.

🧐setter injection

@Service
@Transactional(readOnly = true)
public class MemberService {

   // field injection
   private MemberRepository memberRepository;
	
  @Autowired
  public void setMemberRepository(MemberRepository memberRepository) {
      this.memberRepository = memberRepository;
  }
  
}
スプリングは直接注入するのではなく、setterで注入する形です.利点は、テストコードを記述するときに値を注入できることです.欠点は、アプリケーションの実行時にsetMemberRepositoryを変更する人がいる可能性があることです.誰かじゃない...いいですよ.念のため使用しない方が安定します.アプリケーションが正常に動作している間に変更することは不可能です.

😎constuctor injection

@Service
@Transactional(readOnly = true)
public class MemberService {

    // field injection
    private MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

}
コンストラクション関数注入を使用する場合は、コンストラクション関数によって注入されるため、作成されると完了状態になるため、memberRepositoryをsetに変更することはできません.
また,コンストラクション関数注入を用いる利点は,例えば,テストコードを記述する際に,次の画像のように赤い線をチェックすることである.赤い線を注入する部分が表示されます.新しく作成されると、memberSerivceはリポジトリが必要であることを明確に示します.
文章を書くには、説明が足りないことが多いようです.コードを自分で書くともっと役に立ちます.

最新のスプリングが1つのフィールドしかない場合は@Autowiredを省略できます.上の画像よりも簡単な方法もあります.下の鼻で確認してみます.
@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class MemberService {

    // field injection
    private final MemberRepository memberRepository;
}
@AllArgConstructor言語は使用できますが、finalを追加するフィールドで@RequiredArgConstructorを使用することが望ましいです.requiredはfinalを生成するだけでいいです.

🙄なぜfinalを使うのですか?


memberRepositoryを変更する必要がないのでfinalが追加されます.ジェネレータが作成され、値が指定されていない場合は、ジェネレータに赤い線が生成されます.エラーの発生を確認できるので、原因とも考えられます.