[spring入門]とspring beanの依存関係

4584 ワード

金英漢先生の講義を聞きながら整理中です.
メンバーコントローラは、メンバーサービスから会員を入力、照会できます
->メンバーコントローラメンバーサービス依存

構成部品スキャンと自動依存関係の設定


ControllerフォルダにMemberControllerを作成する
タイミングコントローラがある場合は、スプリングによって管理されます.
スプリングコンテナに空が生成されます.
スプリングコンテナによる管理
複数のコントローラが使えます.(exオーダー、)
1つだけ生成し、共有->スプリングコンテナに登録することができます(スプリングコンテナに1つしか登録されていません)、さまざまな追加効果が表示されます.
@Autowiredを使用してスプリングコンテナからインポートします.
@サービスをメンバーサービスに入れます.
@RepositoryをMemoryMemberRepositoryに挿入

コントローラ、リポジトリ、およびサービスの構造化モード
スプリングが上昇すると、コントローラライブラリがもたらされます.
->注入依存関係(DI)
スプリング空席を登録する2つの方法
構成部品スキャンと自動依存関係の設定
Javaコードを使用してスプリング空席を直接登録する
どちらも知らなければならない.
@Component AnotationはSpring Binとして自動的に登録されます.
すべてのレポートに@コンポーネントが含まれています
@Autowiredは関連ロールです
スプリングがスプリングコンテナにスプリング空として登録されている場合、デフォルトは単一の色調です.
すなわち、同じスプリングシートであれば、すべての例が同じである.(設定に変更可能、現在はX)
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
public class MemberService {
    private final MemberRepository memberRepository;
    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }


    // 회원가입
    public Long join(Member member) {
        validateDuplicateMember(member);    // 같은 이름 X 중복회원검증

        memberRepository.save(member);
        return member.getId();
    }

    private void validateDuplicateMember(Member member) {
        memberRepository.findByName(member.getName())
                .ifPresent(m -> {
                    throw new IllegalStateException("이미 존재하는 회원입니다.");
                });
    }
    //전체 회원조회
    public List<Member> findMember() {
        return memberRepository.findAll();
    }

    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}
package hello.hellospring.controller;

import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

    private  final MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }

}

Javaコードを使用してスプリング空席を直接登録する


メンバー・サービスとメンバー・ライブラリの@Service、@Repository、@Autowiredコメントを削除します.
@Configuration@Beanを使用して直接登録
package hello.hellospring;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.service.MemberService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
}
それぞれ長所と短所がある
過去にxmlドキュメントに設定
DIには、フィールド注入、setter注入、作成者注入の3種類がある
@Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
インジェクションジェネレータ
フィールドの入力
@Authowired private MemberService memberService;
(あまり良くないですが、途中で交換できないので)
setter注入setter作成、呼び出し、setter注入
欠点は、コントローラを呼び出す人がいる場合、共通でなければならないことです.中間交換で問題が発生し、露呈する欠点がある
最近推奨されているスタイルは、インジェクション生成者の使用です.
アプリケーションのアセンブリポイントに入り、終了します.
(依存関係は、実行時に動的に変化することは少ない.)
構造化コントローラ、サービス、リポジトリなどのコードは、構成部品スキャンを使用します.
未定型の場合、または状況に応じてインプリメンテーションクラスを変更する必要がある場合は、設定によってスプリング空席として登録します.
->MemberRepository選択されていないデータストレージを想定
後で別のリポジトリに移動します.
既存の操作コードを変更せずに変更できる方法があります.
だからこれを使います.
構成部品をスキャンする場合は、多くの変更が必要です.
コードを直接実行する場合は、設定ファイルを変更するだけです.
既存のメンバーサービスや他のコードを変更することなく置き換えることができます.