Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Exception
- JDBC
- Servlet
- Greedy
- jpa
- Proxy
- spring
- 자바
- 스프링 핵심 원리
- kotlin
- AOP
- springdatajpa
- db
- 인프런
- http
- Spring Boot
- 김영한
- JPQL
- QueryDSL
- transaction
- 스프링 핵심 기능
- pointcut
- Thymeleaf
- Android
- 스프링
- 그리디
- 백준
- SpringBoot
- 알고리즘
- java
Archives
- Today
- Total
개발자되기 프로젝트
스프링 빈 설정 메타정보 - BeanDefinition 본문
- 스프링은 어떻게 다양한 설정 형식을 지원하지?
- BeanDefinition이라는 추상화 때문임!
- 역할과 구현을 개념적으로 나눈 것!
- xml을 읽어서 BeanDefinition을 만들면 된다.
- 자바 코드를 읽어서 BeanDefinition을 만들면 된다.
- 스프링 컨테이너는 자바 코드인지, 뭔지 몰라도 된다.
- 스플이 컨테이너는 BeanDefinition만! 알면 된다!!!!!! - BeanDefinition을 메타 정보라 함
@Bean, <bean> - 자바 코드 설정의 경우 AppConfig가 factoryBean이다.
- 스프링 컨테이이는 메타정보(BeanDefinition)을 가지고 스프링 빈을 생성한다!!!!
- 추상화에 의존해서 가능하다!
1. 빈 메타정보 생성 과정
2. BeanDefinition 정보
- BeanClassName : 생성할 빈의 클래스(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
- FactoryBeanName : 팩토리 역할의 빈을 사용할 경우 이름, 예)appConfig
자바 설정의 경우 appConfig가 팩토리 역할의 빈이다. - factoryMethodName : 빈을 생성할 팩토리 메서드 지정, 예)memberService
- Scope : 싱글톤(기본값), 할당이 안되어있으면 싱글톤
- lazyInit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성 지연여부
- InitMethodName : 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
- DestoryMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
- Constructor arguments, Properties : 의존관계 주입에서 사용됨(xml에서 사용, 자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
3. 일단 한번 봐보자
public class BeanDefinitionTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig .class);
@Test
@DisplayName("빈 설정 메타정보 확인")
void findApplicationBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole()==BeanDefinition.ROLE_APPLICATION){
System.out.println("beanDefinitionName = " + beanDefinitionName +
"beanDefinition = " + beanDefinition);
}
}
}
}
- 참고로 ac.getBeanDefitnition을 사용하기 위해서는
ApplicationContext가 아닌 AnnotationconfigApplicationContext를 사용해야 한다..
너무 많으니 하나만 보자 ㅋㅋ
beanDefinitionName = orderServicebeanDefinition = Root bean: class [null];
scope=;
abstract=false;
lazyInit=null;
autowireMode=3;
dependencyCheck=0;
autowireCandidate=true;
primary=false;
factoryBeanName=appConfig;
factoryMethodName=orderService;
initMethodName=null;
destroyMethodName=(inferred);
defined in hello.core.AppConfig
4. 정리
- BeanDefinition을 직접 설정해서 스프링 컨테이너에 등록이 가능한데?
- 실무에서 BeanDefinitionㅇ르 직접 정의하거나 사용할 일은 거어어어의 없다.
- BeanDefitnion은 깊게 이해하기 보다는 스프링이 다양한 형태의 설정 정보를
BeanDefinition으로 추!상!화! 해서 사용한다는 것을 이해하자.
5. GitHub : 210726 BeanDefinition
6. 추가 : factory
스프링 빈을 등록하는 방법은 크게 두 가지가 있다.
- 직접 스프링 빈을 등록하는 방법
- factory method를 쓰는 방법
- 자바 코드를 사용해서 등록하는 방법 = factory method
- AppConfig = factory
자바 코드를 통해서 bean을 등록하는 것은 factory method를 사용하는 방법이다.
예를들어 Appconfig에 있는 memberService() method를 통해서 등록하는 것이다.
즉, 자바 코드를 통해서 등록하는 방법은
AppConfig 라는 factory에서 제공하는 memberService()라는 method를 통해 bean을 등록하는 방식은
factory method방법이다.
'인프런 > [인프런] Spring 핵심원리 이해' 카테고리의 다른 글
@Configuration, 싱글톤, 바이트코드 조작 (0) | 2021.07.28 |
---|---|
싱글톤, 싱글톤 컨테이너, 스프링 컨테이너 (0) | 2021.07.27 |
XML로 설정해보자아 (0) | 2021.07.26 |
BeanFactory와 ApplicationContext (0) | 2021.07.26 |
스프링 빈 조회 - 상속관계 (0) | 2021.07.26 |
Comments