21.004.03-04 TIL-Springコア原理-3編


📌 Springコア原理-3編


<ソース:インフラストラクチャSpringコア原理:金英漢講師>


https://www.inflearn.com/roadmaps/373

表計算ドキュメント


コンテナの作成プロセス
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
インタフェースApplicationContextをSpringコンテナと呼びます.
AnnotationConfigApplicationContextは、ApplicationContextの実装体である.
Springコンテナはxmlベースで宣言されたjava構成クラスとして作成できます.
第2編では,@ConfigurationによってSpringコンテナを作成する方法を示した.
新しいN o n t i o n t i o n C o f i g ApplicationContext(設定)情報の指定)
⟹ new AnnotationConfigApplicationContext(AppConfig.class)
(AppConfigクラスでは@Configuration操作が適用されているので、構成情報として使用できます.)
AppConfigもあります@Beanをclassに適用したオブジェクトをspring beanとして登録します.
💥注意:bean名は通常メソッド名を使用しますが、bean(name=「私の心」)はこのように命名できますが、慣例に従ったほうがいいです.
💣 それでも、同じ名前を使用する必要がある場合は、既存のbeanを上書きするか、設定に従ってエラーが発生する可能性があります.
依存関係の確立👉フロー:スプリングコンテナは、設定情報に基づいて依存関係を注入します.
memberServiceはリポジトリのみが必要なため、memberRepositoryのみに依存します.
orderServiceでは、リポジトリと割引ポリシーが必要なため、memberRepository+割引ポリシーが必要です.
このようにして登録された空をクエリーします.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("빈 조회방법")
void findBean(){
	String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    	for(String beanDefinitionNames = beanDefinitionNames){
        		BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionNames);
                	if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
                    		Object bean = ac.getBean(beanDefinitionName);
                            	System.out.println("name은 ="+beanDefinitionName+" /object 부분은 ="+ bean);
                                }
                  }
    }
ac.getBeanDefinitionName():Springに登録されているすべての空の名前をクエリーします.
ROLE APPLICATION:通常ユーザー定義の空(ex.割引ポリシー、メンバーレポート)
ROLE INFRASTRUCTURE:スプリング内部使用の空

表計算ドキュメント


::実際の開発では、BenNullPointが表示されたときに、どのBenが含まれているかを決定します.
よく使うわけではありません.**
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class)
1. 빈 이름+타입으로 조회
void findBeanName(){
	MemberService memberService = ac.getBean("memberService", MemberService.class);
    	assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
        // memberService가 MemberServiceImpl의 인스턴스이면 테스트 성공
 }
2. 오직 타입으로만 조회
 void findBeanType(){
 	MemberService memberService = ac.getBean(MemberService.class);
    	assertThat(memberService).isInstanceOf(MeberServiceImpl.class);
 }
3. 조회가 안되는 경우(실패 테스트)
void findBeanX(){
	Assertions.assertThrows(NoSuchBeanDefinitionException.class, () 
    ⟶ ac.getBean("xx", MemberService.class));
}
//ac.getBean부분이 없으면 NoSuchBeanDefinitionException에러가 터질 것이고, 그 에러가 터지면 테스트는 성공!

表計算ドキュメント

  • 親タイプで検索すると、子供タイプも同時に検索されます.
  • の親Objectタイプでクエリーし、すべてのspringbinをクエリーします.
  • AnnotationConfigApplicationContext ac = new  AnnotationConfigApplicationContext(AppConfig.class)
    // 부모 타입으로 조회시, 자식이 둘 이상 있으면, 빈 이름을 지정하면 된다
    void findBeanByParentTypeBeanName(){
    	DisCountPolicy rateDiscountPolicy = ac.getBean("rateDiscountPolicy", DiscountPolicy.class);
        	assertThat(rateDiscountPolicy).isInstanceOf(RateDiscountPolicy.class);
    }
    // 특정 하위 타입으로 조회 : RateDiscountPolicy
    void findBeanType(){
    	RateDiscountPolicy bean = ac.getBean(RateDiscountPolicy.class);
        	assertThat(bean).isInstanceOf(RateDiscountPolicy.class);
    }
    // 부모 타입으로 조회하기 : DiscountPolicy
    void findParentType(){
    	Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
        	assertThat(beansOfType.size()).isEqualTo(2);
            for(String key:beansOfType.keySet()){
            	System.out.println("key값은 = "+ key +" /value값은 ="+beansOfType.get(key));
           }
    }
    ➽今回はスプリングコンテナの生成過程とその中の空きクエリー方法を簡単にまとめた.
    クエリが空の場合はBeanNullPointに使用されます.この場合は一般的ではありませんが、このクエリの生成と定義の方法を熟知しておくとよいでしょう.