Basic#3 Spring Bean
3. Spring Bean
1. Spring Container
Spring container가 각 객체를 bean으로 등록하여 사용한다고 이전 section에 잠깐 확인했었다. 이를 위해서는 구성 정보가 필요하고 이를 AppConfig.class
의 @Bean
를 통해서 제공했다.
ApplicationContext
가 Spring container라고 부를 수 있으며 이를 상속받아 annotation으로 bean 정보를 제공하는 AnnotationConfigApplicationContext
로 사용한다. 이 container가 AppConfig
의 annotation을 이용하여 Bean을 생성하고 DI를 실행한다.
BeanFactory
Spring의 최상위 인터페이스로, spring bean을 관리/조회하는 역할을 제공
ApplicationContext
BeanFactory
외에 다른 인터페이스를 상속받는 spring container 인터페이스
- 메세지 소스
- 환경 변수
- 애플리케이션 이벤트
- 리소스 조회
지금까지 했던 방식은 annotation으로 bean 정보를 제공하는 방법을 이용했다. 하지만 spring container는 다양한 방식을 지원 가능 하다.(class, XML, ...) 중요한 건 얼마나 유연하게 컨테이너를 생성할 수 있는지를 아는 것
BeanDefinition
그럼 어떻게 다양한 설정 형식을 지원할까?
결국은 XML이든, java든 BeanDefinition
을 만들고 spring container는 이를 참조하게끔 만들면 된다는 것. 이러한 BeanDefinition
을 Meta정보라고 부르며 spring container가 필요로 하는 궁극적인 데이터다.
2. Bean
구현체가 spring container에 의해 Bean으로 생성되고 관리되기 때문에 bean을 조회하거나 사용하려면 container를 이용한다.
Bean 가져오기
container의 BeanDefinition
을 가져와서 bean을 확인할 수 있다.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
String[] beanDefinitionNames = ac.getBeanDefinitionNames(); // 메타정보에 포함된 bean의 이름 정보
이때, 개발자가 추가한 bean 만을 확인하려면, BeanDefinition.ROLE_APPLICATION
을 이용한다.
for(String beanDefinition : beanDefinitionNames) {
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
}
}
ac.getBean()
은 bean의 이름, 타입, 또는 둘 다를 사용하여 가져올 수 있다.
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
ac.getBean("name", type);
특정 타입의 bean을 모두 가져오려면 ac.getBeansOfType()
을 이용한다. return값은 Map형식으로 반환된다.
Map<String, MemberService> beans = ac.getBeansOfType(MemberService.class);
Bean을 조회할 때, 그 bean뿐만 아니라 자식 bean도 가져오는 것을 기억해야한다. (Bean도 상속관계를 가진다.) 특정 자식 bean만을 조회할 때는 해당되는 하위 클래스로 조회하거나 이름을 지정하여 조회하여야 한다.
🛠 계속 업데이트 필요
2022.03.05 최초 작성
Author And Source
이 문제에 관하여(Basic#3 Spring Bean), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dev2danis/Spring-Basic3-Spring-Bean저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)