AnnotationConfig**ApplicationContext**
를 사용했음!Serializable
인터페이스 구현Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println);
//org.springframework.context.annotation.internalConfigurationAnnotationProcessor
//org.springframework.context.annotation.internalAutowiredAnnotationProcessor
//org.springframework.context.annotation.internalCommonAnnotationProcessor
//org.springframework.context.event.internalEventListenerProcessor
//org.springframework.context.event.internalEventListenerFactory
//helloWorldConfiguration
//name
//age
//person
//person2MethodCall
//person3Parameters
//address2
//address3
context.getBeanDefinitionNames()
: 레지스트리에 정의된 모든 Bean의 이름을 반환context.getBeanDefinitionCount()
: 레지스트리에 정의된 Bean의 개수 반환context.getBeanDefinition(String beanName)
: beanName을 매개 변수로 받아 해당하는 BeanDefinition 반환Spring Bean은 이름으로도 검색 가능하지만, 유형으로도 검색 가능함. ex. context.getBean(Address.class)
. 그러나 이 때 후보가 여러 개일 때는 예외가 발생함. 따라서 문제를 해결하려면 Bean 사이의 우선 순위를 결정해줘야 함.
@Primary
이 문제를 해결하려면 특정 빈을 primary로 설정해주면 됨.
@Bean(name = "address2")
@Primary
public Address address() {
return new Address("Baker Street", "London");
}
@Bean(name = "address3")
public Address address3() {
return new Address("Motinagar", "Hyderabad");
}
위 상황에서 system.out.println(context.getBean(Address.class))
를 실행하면 address2가 출력됨.
@Qualifier
@Bean
public Person person5Qualifier(String name, int age,
@Qualifier("address3Qualifier") Address address) {
return new Person(name, age, address);
}
@Bean(name = "address2")
@Primary
public Address address() {
return new Address("Baker Street", "London");
}
@Bean(name = "address3")
@Qualifier("address3Qualifier")
public Address address3() {
return new Address("Motinagar", "Hyderabad");
}
address3에 @Qualifier
를 달아주었고, person5Qualifier에서 Address 앞에 동일한 @Qualifier
한정자를 달아줌으로써 Bean끼리 연결 시킴.