Back-end/spring frameworks
스프링 컨테이너와 빈
Hazel Han
2023. 11. 19. 15:37
구현체가 여러개라면?
만약 OrderService 인터페이스에 대한 구현체가 하나라면, 일반적으로는 구현체의 이름을 OrderServiceImpl이라고 한다. 하지만, 구현체가 여러개라면 각 구현체의 특성에 맞게 이름을 생성한다.
@BeforeEach
: 테스트 코드 실행 전 반드시 실행되는 것으로, 테스트 코드가 2개면 2번 실행된다.
class MemberServiceTest {
MemberService memberService;
@BeforeEach
public void beforeEach() {
AppConfig appConfig = new AppConfig();
memberService = appConfig.memberService();
}
}
스프링 컨테이너와 빈
스프링 컨테이너
ApplicationContext를 스프링 컨테이너라고 하며, 이것은 인터페이스이다.
스프링 컨테이너 안에 빈 저장소가 있고, 빈 정보를 가져다 사용할 수 있다.
스프링 빈
Spring IoC 컨테이너가 관리하는 자바 객체로서 컨테이너에 의해 생명주기가 관리되는 객체를 의미한다.
스프링 빈 조회 방법
class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 빈 출력하기")
void findAllBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name=" + beanDefinitionName + " object=" +
bean);
}
스프링에 등록된 모든 빈 조회하기
ac.getBean(빈이름, 타입);
조회대상 스프링 빈이 존재하지 않으면, 아래와 같은 에러가 발생한다.
NoSuchBeanDefinitionException: No bean named 'xxxxx' available
타입으로 빈 조회하기
ac.getBeansOfType();
위 코드를 사용하면 타입으로 빈을 조회할 수 있는데, 이 때 같은 타입의 빈이 두 개 이상 존재하면 에러가 발생한다.
해결방안 : 각 빈마다 이름을 지정하자.
빈 상속
Object 타입으로 빈을 조회하면, 모든 빈을 조회할 수 있다.
class ApplicationContextExtendsFindTest {
AnnotationConfigApplicationContext ac = new
AnnotationConfigApplicationContext(TestConfig.class);
@Test
@DisplayName("부모 타입으로 모두 조회하기 - Object")
void findAllBeanByObjectType() {
Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
for (String key : beansOfType.keySet()) {
System.out.println("key = " + key + " value=" +
beansOfType.get(key));
}
}