스프링/입문

스프링 컨테이너와 스프링 빈 (1)

eunkyung 2022. 9. 4. 16:00

*스프링 컨테이너가 어떻게 생성될까?

AnnotationConfigApplicationContext객체 생성 시 AppConfig.class를 파라미터로 넘기고, applicationContext가 반환되었었다.  ApplicationContext ->스프링 컨테이너/인터페이스(다형성이 적용 되어있음. 이를 구현한 것 중 하나가 AnnotationConfigApplicationContext(annotationConfig 기반 스프링)이다.).

-스프링은 XML기반(잘 사용 X) / Annotation기반(편리해서 많이 사용) 자바 설정 클래스로 만들 수 O. -> new로 생성하고 appconfig를 파라미터로 넣어줌. 

//스프링 컨테이너 생성
ApplicationContext applicationContext =
 new
AnnotationConfigApplicationContext(AppConfig.class);

 

>스프링 생성 과정

1)스프링 컨테이너 생성

1)스프링 컨테이너 생성

new AnnotationConfigApplicationContext로 appConfig의 정보를 줌.

->스프링 컨테이너 생성(스프링 빈 저장소가 안에 있음(키는 빈의 이름이 되고 값은 빈의 객체가 됨) //스프링 컨테이너 생성 시 구성 정보를 지정해줘야 하는데 그게 바로 AppConfig(구성 정보)를 파라미터로 넣어준 것. 이정보를 보고 객체 생성

 

2)스프링 빈 등록

구성 정보를 넘기고 @Bean이 붙은 모든 것을 다 호출하고, 메소드 이름을 키 값으로 하여 빈 이름으로 저장, 반환 객체를 빈 객체로 등록.  +)빈 이름은 직접 부여도 가능은 한데 빈이름은 항상 다른 이름을 부여해야 함.

 

3)스프링 빈 의존관계 설정-준비

 

4)의존 관계 설정 완료

의존관계를 주입(DI). 동적인 의존 관계를 스프링이 다 연결. 객체의 참조값들이 다 연결.

자바 코드를 호출하는 것 같지만, 차이가 O, 차이는 뒤에 싱글톤 컨테이너에서 설명.

스프링은 빈을 생성하고, 의존관계를 주입하는 단계가 나누어져 있음(스프링 빈 객체 생성하고 엮어줌.)

그런데 이렇게 자바 코드로 스프링 빈을 등록 시 생성자를 호출하면서 의존관계 주입도 한번에 처리. 

 

=>컨테이너에 빈이 잘 등록되었는지 확인

//junit5부터는 public사용 안해도됨.

getBeanDefinitionNames()로 :스프링에 등록된 모든 빈 이름을 조회

+)list같은 게 있을 때 iter + tab키 -> 자동으로 for문 완성.

getBean으로 빈 꺼내는데 타입 정의하지 않았기에 object로 꺼냄.

 

만약 스프링 내부에  있는 것은 제외하고 내가 등록한 빈만 보고 싶다면? -> 애플리케이션 빈만 출력하면 됨.

빈 하나하나에 대한 메타 데이터 정보인 beanDataDefinition을 이용하여 꺼낼 수 O.

getRole()을 사용(조건엔 따라 애플리케이션 개발 위해 등록한 빈을 반환)

+)Role_Infrastructure은 스프링 컨테이너 내부에서 사용하는 빈들. 

'스프링 > 입문' 카테고리의 다른 글

다형성  (0) 2022.09.04
스프링이란?  (0) 2022.09.04
AOP  (0) 2022.09.04
스프링 컨테이너와 스프링 빈 (3)  (0) 2022.09.04
스프링 컨테이너와 스프링 빈 (2)  (0) 2022.09.04