스프링 컨테이너(Container)와 스프링 빈(Bean)
2022. 6. 16. 01:43ㆍTIL💡/Java
- ApplicationContext를 스프링 컨테이너라 한다.
- 기존에는 개발자가
AppConfig
를 사용해서 직접 객체를 생성하고 DI를 했지만, 이제부터는 스프링 컨테이너를 통해서 사용한다. - 스프링 컨테이너는
@Configuration
이 붙은AppConfig
를 설정(구성)정보로 사용한다. 여기서Bean
이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다. - 스프링 빈은
@Bean
이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.(ex. memberService, orderService) - 빈 이름을 직접 부여할 수도 있다. 하지만 빈 이름은 고유해야 한다. 같은 이름을 부여하면 다른 빈이 무시되거나 설정이 덮어버리므로 오류가 발생한다. (중복 불가) ex)
@Bean(name="memberService2")
- 이전에는 개발자가 필요한 객체를 AppConfig를 사용해서 직접 조회했지만, 이제부터는 스프링 컨테이너를 통해서 필요한 스프링 빈(객체)를 찾아야 한다. 스프링 빈은 applicationContext.getBean()메서드를 사용해서 찾을 수 있다.
- 기존에는 개발자가 직접 자바 코드로 모든 것을 했다면 이제부터는 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용하도록 변경되었다.
- 스프링 컨테이너는 XML을 기반으로 만들 수 있고, 애노테이션 기반의 자바 설정 클래스로도 만들 수 있다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
AnnotationConfigApplicationContext
는 ApplicationContext
라는 인터페이스의 구현체이다.
스프링 컨테이너를 생성할 때는 구성정보를 지정해주어야 하므로, AppConfig.class
전달하였다.
- 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.
모든 빈 출력하기
ac.getBeanDefinitionNames()
: 스프링에 등록된 모든 빈 이름을 조회ac.getBean()
: 빈 이름으로 빈 객체(인스턴스) 조회
애플리케이션 빈 출력하기
- 스프링이 내부에서 사용하는 빈은 제외하고 내가 등록한 빈만 출력해보자
- 스프링이 내부에서 사용하는 빈은
getRole()
로 구분할 수 있다.- ROLE_APPLICATION
- ROLE_INFRASTRUCTURE
스프링 빈 조회 - 동일한 타입이 둘 이상
- 타입으로 조회 시 같은 타입의 스프링 빈이 둘 이상이면 오류가 발생한다. 이 때는 빈 이름을 지정하자.
ac.getBeansOfType()
을 사용하면 해당 타입의 모든 빈을 조회할 수 있다.
'TIL💡 > Java' 카테고리의 다른 글
[Java] 스레드 이해 (0) | 2022.10.21 |
---|---|
[Java] 스레드 생명 주기 상태 (0) | 2022.10.21 |
[Java] 자바 동시성(멀티스레딩)의 개요 (0) | 2022.10.21 |
IoC, DI, 그리고 컨테이너 (0) | 2022.06.14 |
[Spring] 🌱스프링 핵심 원리 강의 메모 (0) | 2022.06.10 |