Enthusiasm! Enthusiasm!

스프링 빈 조회 본문

자바 스프링/스프링 핵심원리

스프링 빈 조회

열동 2023. 1. 4. 23:18

이제 컨테이너에 등록된 스프링 빈을 활용해보자. 스프링 빈을 활용하기 위해서는 먼저 스프링 빈을 조회해야한다.

 

  • 컨테이너에 등록된 모든 빈 조회
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

 

모든 빈을 조회하기 위해서는 Beandefinition을 사용해야한다. 스프링 컨테이너를 ApplicationContext로 선언하면 Beandefinition을 사용할 수 없으므로 Beandefinition을 사용하기 위해서는 AnnotationConfigApplicationContext로 컨테이너를 선언해줘야 한다.

 

String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
    BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

    //Role ROLE_APPLICATION: 직접 등록한 애플리케이션 빈
    //Role ROLE_INFRASTRUCTURE: 스프링이 내부에서 사용하는 빈
    if(beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){
        Object bean = ac.getBean(beanDefinitionName);
        System.out.println("name = " + beanDefinitionName + "object = " + bean);
    }
}

 

  • 이름 / 타입으로 조회
//빈 이름,타입으로 조회
MemberService memberService = ac.getBean("memberService", MemberService.class);
//이름 없이 타입으로 조회
MemberService memberService = ac.getBean(MemberService.class);
//구현체 타입으로 조회
MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
//특정 타입을 모두 조회
Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);

 

-스프링 컨테이너에 같은 타입의 빈이 여러개 등록되어있는 경우 이름없이 타입으로 조회하면 중복 오류가 발생한다. 같은 타입이 둘 이상 있을 때는 빈 이름을 지정해줘야 한다! (특정 타입을 모두 조회할 수도 있다.)

-구현체 타입으로 조회하는 경우는 코드가 구현체에 의존하기 때문에 좋은 방법이 아니다. 지양하는게 좋다

 

  • 상속관계 조회

상속관계 예시

-부모타입으로 조회하면, 자식 타입도 함께 조회된다!!

-타입으로 조회하는 경우와 마찬가지로, 부모 타입으로 조회시 자식이 둘 이상 있으면 중복 오류가 발생한다. 이 때 빈 이름을 지정하면 오류를 해결할 수 있다.

 

  • BeanFactory / ApplicationContext

BeanFactory의 상속관계

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스이다. 스프링 빈을 관리하고 조회하는 역할을 담당한다.
  • getBean()을 제공한다. 컨테이너의 대부분의 기능은 BeanFactory가 제공하는 기능이다.

ApplicationContext

  • BeanFactory 기능을 모두 상속받아서 제공하며, 그 외에 부가기능을 지원한다.
  • ex) MessageSoure를 활용한 국제화 기능, 환경변수 설정, 애플리케이션 이벤트, 편리한 리소스 조회 등

 

  • BeanDefinition
    • 스프링은 자바코드,XML등 다양한 설정 형식을 지원한다. 그 중심에는 BeanDefinition 이라는 추상화(인터페이스)가 있다.
    • 다형성의 기본인 역할과 구현을 나눠 자바코드일때, 자바 코드를 읽어 BeanDefinition을 만들고 XML일때는 XML을 읽어서 BeanDefinition을 만든다.
    • 스프링 컨테이너는 설정형식이 자바인지 XML인지 알 필요 없이 BeanDefinition만 알면 된다!!
    • BeanDefinition을 빈 설정 메타정보라 하고 @Bean하나당 하나씩 메타정보가 생성된다.

BeanDefinition의 기능

-BeanDefinition 정보에는 BeanClassName, factoryBeanName, factoryMethodName, Scope, lazyinit, InitMethodName, DestroyMethodName, Constructor arguments 과 같은 정보가 담긴다.

 

BeanDefinition정보 출력결과

 

위와 같은 방법들로 스프링빈을 조회하고 사용할 수 있다

 


이전 포스팅 - 객체지향 설계- 스프링으로 전환 https://yulddong.tistory.com/10

 

객체지향 설계 - 스프링으로 전환

이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다. 이전 포스팅에 있던 AppConfig 클래스를 스프링으로 전환해보겠다. -@Configuration은 스프링

yulddong.tistory.com

다음 포스팅 - 싱글톤 컨테이너:https://yulddong.tistory.com/12

 

싱글톤 컨테이너

싱글톤 패턴(디자인) 스프링 전환 이전의 AppConfig를 다시 한번 살펴보자 -위 AppConfig의 문제점은 호출할때마다 새로운 객체를 생성하고 반환하고 있어, 동시에 여러 요청을 처리하는 프로그램에

yulddong.tistory.com


이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다.

Comments