ApplicationContext
스프링 컨테이너이자 , 인터페이스
스프링 컨테이너 : XML , 에노테이션 기반의 자바 설정 클래스도 가능
new GenericXmlApplicationContext(); // xml 설정
new AnnotationConfigApplicationContext(AppConfig.class);
// @Bean 으로 등록후 사용하는 것이 이에 해당
AppConfig.class
를 기반으로 스프링 컨테이너 생성
💡 참고로 파라미터로 넘긴 값(AppConfig.class)도 컨테이너에 등록된다.
스프링 컨테이너 생성(AppConfig.class)
구성 정보 활용 하여 스프링 컨테이너에 빈 이름과 객체를 등록한다.
이때 구성 정보클래스의 메소드 명이 빈 이름
이 된다.
@Bean
public MemberRepository memberRepository (){ // memberRepository 가 빈 이름
return new MemoryMemberRepository(); // 객체 등록
}
빈이름 설정
@Bean(name="")
// 중복 주의
ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름 조회 (배열로 받기)
Ex)
String[] beanDefinitionNames = ac.getBeanDefinitionNames()
ac.getBean() : 빈 이름으로 빈 객체를 조회
getRole()를 사용하여 스프링 내부 빈 or 사용자 정의 빈 구분
ROLE_APPLICATION : 일반적인 사용자 정의 빈
ROLE_INFRASTRUCTURE : 스프링 내부 사용 빈
ex)
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition =
ac.getBeanDefinition(beanDefinitionName);
if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION)
ac.getBean(빈이름
, 타입)
타입
만으로도 조회가 가능하다.
// 빈이름 조회
MemberService memberService = ac.getBean("memberService", MemberService.class);
//타입
MemberService memberService = ac.getBean(MemberService.class);
✔️ 동일 타입 둘이상
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);
부모 타입 조회 : 자식 타입도 함께 조회
Object 타입으로 조회 : 모든 스프링 빈 조회됌
스프링 컨테이너 최상위 인터페이스
빈 관리 조회 역할 담당
getBean()
제공
BeanFactory 기능을 모두 상속받아 제공
-> 빈 관리기능 + 편리한 부가 기능을 제공
스프링 컨테이너는 BeanDefinition을 통해 자바 코드, xml 상관없이 메타 정보를 통해 스프링 빈 등록(생성)
@Bean , <bean> 당 각각 하나씩 메타 정보가 생성
이보다 더 편리한 컴포넌트 스캔이 있다. 하지만 수동으로 직접 빈을 등록하는 방법도 알아야한다. 보통 AnnotationConfigApplicationContext을 쓰는 듯하다.
Config 구성정보의 메소드명이 빈 이름이 되는 것과
파라미터로 넘긴 Config도 컨테이너에 등록된다는 것을 기억하자.
🔖 학습내용 출처