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에러가 터질 것이고, 그 에러가 터지면 테스트는 성공!
表計算ドキュメント
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に使用されます.この場合は一般的ではありませんが、このクエリの生成と定義の方法を熟知しておくとよいでしょう.
Reference
この問題について(21.004.03-04 TIL-Springコア原理-3編), 我々は、より多くの情報をここで見つけました https://velog.io/@ddwj/21.04.03-04-TIL-Spring-핵심원리-3편テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol