Springコア原理TIL(7)


[参考講座]金英漢のスプリングコア原理-基本編

💡 たんトンコンテナ


スプリングコンテナは、モノトーンモードの問題を解決しながら、オブジェクトインスタンスをモノトーンに管理します.スプリングビンは単調な文員だ.

▼▼単トンコンテナ

  • スプリングコンテナは、モノトーンモードではなく、モノトーンでオブジェクトインスタンスを管理します.
  • スプリングコンテナは単トンコンテナの役割を果たす.このようなモノトーンオブジェクトを生成および管理する機能をモノトーンレジストリと呼ぶ.
  • スプリングコンテナは、オブジェクトがモノトーンを維持しながらモノトーンモードのすべての欠点を解決します.
  • DIP、OCP、プライベート作成者は、テストからモノトーンを自由に使用できます.
  • スプリングコンテナを使用したテストコード

    @Test
    @DisplayName("스프링 컨테이너와 싱글톤")
      void springContainer() {
          ApplicationContext ac = new
      AnnotationConfigApplicationContext(AppConfig.class);
         //1. 조회: 호출할 때 마다 같은 객체를 반환
          MemberService memberService1 = ac.getBean("memberService",
      MemberService.class);
         //2. 조회: 호출할 때 마다 같은 객체를 반환
          MemberService memberService2 = ac.getBean("memberService",
      MemberService.class);
         //참조값이 같은 것을 확인
          System.out.println("memberService1 = " + memberService1); 
          System.out.println("memberService2 = " + memberService2);
          
          //memberService1 == memberService2
          assertThat(memberService1).isSameAs(memberService2);
      }
    

    スプリングコンテナを使用すると、お客様が要求するたびに作成するのではなく、作成したオブジェクトを共有することで、これらのオブジェクトを効率的に再利用できます.

    ▼▼▼モノトーン方式の注意点

  • モノトーンモードでも、スプリングなどのモノクロコンテナでも、オブジェクトインスタンスを1つ共有するオブジェクトインスタンスを作成するモノトーン方式は、複数のクライアントが同じオブジェクトインスタンスを共有するため、モノトーンオブジェクトはステータス設計を維持できません.
  • 無状態設計が必要!
  • 特定のクライアントに依存フィールドはありません.
  • 特定のクライアント値を変更できるフィールドはありません.
  • は、できるだけ読み取り専用にしてください.
  • フィールドではなくjavaで共有されていない、領域変数、パラメータ、ThreadLocalなどを使用する必要があります.
  • スプリングシートのフィールドに共有値を設定すると、大きな障害が発生する可能性があります.

    ステータスコードなし

    public class StatefulService {
    
        public int order(String name, int price) {
            System.out.println("name = " + name + " price = " + price );
            return price;
        }
    
    }

    @Configurationとモノトーン


    Springは、CGIBというバイトコード操作ライブラリを使用してAppConfigクラスを継承する他のクラスを作成し、他のクラスをSpringBeanとして登録します.
    このいずれかの異なるクラスが単色調であることを直接保証できるようにします.

    AppConfig@CGLIB予想コード

    @Bean
    public MemberRepository memberRepository() {
    
        if (memoryMemberRepository가 이미 스프링 컨테이너에 등록되어 있으면?) { 
        	return 스프링 컨테이너에서 찾아서 반환;
         } else { //스프링 컨테이너에 없으면   
    	기존 로직을 호출해서 MemoryMemberRepository를 생성하고 스프링 컨테이너에 등록 
        return 반환
         } 
      }
    これが単一の色調が保障されている理由です.😎
    @Bean付きの各メソッドにスプリング空席が既に存在する場合は、存在する空席を返します.
    スプリングシートがない場合は、コードが動的に作成され、スプリングシートとして登録され、戻ります.

    💡 スイープエレメント


    走査素子の開始と自動注入依存性


    スプリングは、素子スキャンと呼ばれる機能を提供し、設定情報がなくても自動的にスプリングシートを登録することができる.依存関係を自動的に注入する@Autowired機能も用意されています.

    AutoAppConfig.java

    @Configuration
    @ComponentScan(
           excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
    public class AutoAppConfig {
    
    }
  • 構成部品スキャンを使用するには、まず@ComponentScanを構成情報に貼り付けます.
  • 既存のAppConfigとは異なり、@Beanとして登録されているクラスは1つもありません.
  • 構成部品スキャンでは、@Componentコメントを持つクラスが名前でスキャンされ、SpringBinとして登録されます.
  • MemberServiceImpl@Component,@Autowired追加

    @Component
    public class MemberServiceImpl implements MemberService {
    
          private final MemberRepository memberRepository;
          
          @Autowired
          public MemberServiceImpl(MemberRepository memberRepository) {
              this.memberRepository = memberRepository;
          }
    }
    MemoryMemberRepository@Component、RateDiscountPolicy@Component CNrk、MemberServiceImpl@Component、および@Autowiredを追加します.
  • は現在、このような設定情報自体がないため、依存関係注入もクラスで解決する必要がある.
  • @Autowiredは依存関係を自動的に注入します.
  • スキャン構成部品の詳細については、次のTILを参照してください.😎