Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
01-08 10:48
- Today
- Total
Tags
- 스프링 빈
- 롬복 Qualifier
- 도커
- qualifier
- Spring
- ComponentScan
- 스프링 컨테이너
- 빈 중복 오류
- 스프링 빈 조회
- Spring interceptor
- 스프링
- 생성자 주입
- DI
- 라즈베리파이4
- HandlerMethodArgumentResolver
- springsecurity
- Servlet Filter
- 스프링 싱글톤
- docker
- 싱글톤 컨테이너
- DI컨테이너
- Autowired 옵션
- 스프링 Configuration
- beandefinition
- 라즈베리파이
- autowired
- 의존관계 주입
- RequiredArgsConstructor
- UsernamePasswordAuthenticationFilter
- 객체지향
Archives
그날그날 공부기록
스프링 컨테이너 생성 과정 본문
스프링 컨테이너 생성 과정
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext를 스프링 컨테이너라고 한다.(정확히는 BeanFactory와 ApplicationContext로 구분)
ApplicationContext는 인터페이스이고, 애노테이션에 기반하여 설정 클래스를 생성했기 때문에 AnnotationConfigApplicationContext라는 구현체를 사용한다.
스프링이 생성되는 과정은 다음과 같다. 하지만 생성자를 호출하며 의존관계 설정도 한번에 이루어지기 때문에 개념적인 단계라고 한다.
- 스프링 컨테이너 생성
- new AnnotationConfigApplicationContext(AppConfig.class)로 컨테이너 생성
- 컨테이너 생성을 위해 구성정보가 필요하고, AppConfig.class를 구성정보로 지정했다.
- 스프링 빈 등록
- AppConfig 클래스를 사용하여 스프링 빈을 등록한다 (key:메서드 이름, value:반환 객체)
- 스프링 의존관계 설정 - 준비
- 스프링 의존관계 설정 - 완료
- 다음 사진처럼 AppConfig를 참고하여 의존관계를 주입한다.
- 단순히 자바 코드를 호출하는것이 아니라고 한다.
아직 강의에 안나왔지만 빈 생성 로그에 싱글톤 빈이라고 출력되는것을 보니 빈을 생성하고 싱글톤 패턴으로 관리하는것 같다.
스프링 빈 조회
public class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 빈 출력")
void findAllBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("Name = " + beanDefinitionName + " obj = " + bean);
}
}
@Test
@DisplayName("애플리케이션 빈 출력")
void findApplicationBean(){
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
Object bean = ac.getBean(beanDefinitionName);
System.out.println("Name = " + beanDefinitionName + " obj = " + bean);
}
}
}
}
getBeanDefinitionNames() → 스프링 컨테이너에 등록된 모든 빈들의 이름을 조회
getBean() → 빈 이름으로 빈 인스턴스를 조회한다.
이렇게 출력하면 스프링 내부에서 사용하기위해 자동 생성된 빈도 같이 출력된다.
내가 등록한 빈만 조회하려면 어떻게 해야할까?
getRole()로 내가 등록한 빈과 스프링 내부에서 사용되는 빈을 구분할 수 있다.
- .ROLE_APPLICATION → 사용자가 정의한 빈
- .ROLE_INFRASTRUCTURE → 스프링이 내부에서 사용하는
'Spring 공부' 카테고리의 다른 글
BeanFactory & ApplicationContext (0) | 2022.07.15 |
---|---|
스프링 빈 조회 (0) | 2022.07.11 |
IoC, DI, 컨테이너 (0) | 2022.07.06 |
스프링 DI 이해하기 (0) | 2022.07.05 |
SOLID (0) | 2022.07.05 |
Comments