반응형
AppConfig에 등록된 스프링 빈을 모두 조회하고자 한다.
참고로 AppConfig에 등록된 스프링 빈들은 아래와 같다.
package hello.core;
import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean // 스프링 컨테이너에 등록이 됨
public MemberService memberService() {
System.out.println("call AppConfig.memberService");
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
System.out.println("call AppConfig.memberRepository");
return new MemoryMemberRepository();
}
@Bean
public OrderService orderService() {
System.out.println("call AppConfig.orderService");
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy() {
// return new FixDiscountPolicy(); // 정액 할인
return new RateDiscountPolicy(); // 정률 할인
}
}
● 컨테이너에 등록된 모든 빈 조회
○ 테스트 코드 작성
ApplicationContextInfoTest.java
package hello.core.beanfind;
import hello.core.AppConfig;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("모든 빈 출력하기")
void findAllBean() {
// ac.getBeanDefinitionNames() : 스프링에 등록된 모든 빈 이름을 조회한다.
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
// ac.getBean() : 빈 이름으로 빈 객체(인스턴스)를 조회한다.
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
}
.getBeanDefinitionNames() 메서드를 통해
스프링 컨테이너에 등록된 모든 빈 이름을 조회한 후,
.getBean() 메서드로 빈 객체(인스턴스)를 조회할 수 있다.
테스트 코드를 실행해보면..
컨테이너에 등록된 모든 스프링 빈들이 출력되는 것을 볼 수 있다.
하지만 출력 결과를 보면
org.springframework.context.... 로 시작하는 빈들을 볼 수 있다.
(내가 등록한 적이 없는데,,)
이 빈들은 스프링을 실행할 때 생성되는 고유의 스프링 빈들이다.
이것들을 제외하고 내가 생성한 애플리케이션 빈들만 출력할 수는 없을까?
○ 애플리케이션 빈 조회(내가 생성한 빈)
ApplicationContextInfoTest.java
package hello.core.beanfind;
import hello.core.AppConfig;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
class ApplicationContextInfoTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
@Test
@DisplayName("애플리케이션 빈 출력하기")
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
// ac.getBeanDefinition(빈 이름) : 해당 빈에 대한 메타데이터 정보를 갖고옴
BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);
// ROLE_APPLICATION : 일반적으로 사용자가 정의한 빈
// ROLE_INFRASTRUCTURE : 스프링이 내부에서 사용하는 빈
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " object = " + bean);
}
}
}
}
.getBeanDefinition 메서드를 통해
해당 빈에 대한 메타데이터 정보를 갖고 온 후,
.ROLE_APPLICATION을 통해
애플리케이션 빈(내가 생성한 빈)들만 조회할 수 있다.
실행 결과는..
정상적으로 내가 등록한 빈들만 출력이 되는 것을 볼 수 있다.
반응형
'Java > Spring' 카테고리의 다른 글
[Spring] Spring bean(빈) 조회 - 동일한 타입이 둘 이상 (0) | 2022.01.20 |
---|---|
[Spring] Spring bean(빈) 조회 - 기본 (0) | 2022.01.20 |
[Spring] 스프링 컨테이너 생성(@Configuration) | 스프링 빈 등록(@Bean) | 스프링 컨테이너 적용 | 스프링 의존성 주입(DI) (0) | 2022.01.15 |
[Spring] IoC(제어의 역전), DI(의존성 주입), Container(컨테이너) | 프레임워크 VS 라이브러리 (0) | 2022.01.15 |
[Spring] Spring 고객-주문 시스템 구현 | AppConfig | 관심사의 분리 (0) | 2022.01.14 |