일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- ExceptionResolver
- 프로토타입 스코프
- HTTP 응답 메시지
- 스프링 빈
- 서블릿
- 스프링 타입컨버터
- BasicErrorController
- 백준 2263
- 의존관계
- 백준4256
- 프로토콜 스택 4계층
- 체크에러
- BeanValidation
- http
- 커밋로그
- 객체지향
- HTTP 요청 메시지
- 스프링 예외변환기
- 예외추상화
- 김영한
- BeanDefnition
- DI
- 스프링 파일 업로드
- 웹 스코프
- 스프링
- 깃허브 저장소 합치기
- 스프링 컨테이너
- REST #REST API #HTTP 메서드
- 언체크에러
- HTTP메시지
- Today
- Total
Enthusiasm! Enthusiasm!
스프링 빈 조회 본문
이제 컨테이너에 등록된 스프링 빈을 활용해보자. 스프링 빈을 활용하기 위해서는 먼저 스프링 빈을 조회해야한다.
- 컨테이너에 등록된 모든 빈 조회
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
- 스프링 컨테이너의 최상위 인터페이스이다. 스프링 빈을 관리하고 조회하는 역할을 담당한다.
- getBean()을 제공한다. 컨테이너의 대부분의 기능은 BeanFactory가 제공하는 기능이다.
ApplicationContext
- BeanFactory 기능을 모두 상속받아서 제공하며, 그 외에 부가기능을 지원한다.
- ex) MessageSoure를 활용한 국제화 기능, 환경변수 설정, 애플리케이션 이벤트, 편리한 리소스 조회 등
- BeanDefinition
- 스프링은 자바코드,XML등 다양한 설정 형식을 지원한다. 그 중심에는 BeanDefinition 이라는 추상화(인터페이스)가 있다.
- 다형성의 기본인 역할과 구현을 나눠 자바코드일때, 자바 코드를 읽어 BeanDefinition을 만들고 XML일때는 XML을 읽어서 BeanDefinition을 만든다.
- 스프링 컨테이너는 설정형식이 자바인지 XML인지 알 필요 없이 BeanDefinition만 알면 된다!!
- BeanDefinition을 빈 설정 메타정보라 하고 @Bean하나당 하나씩 메타정보가 생성된다.
-BeanDefinition 정보에는 BeanClassName, factoryBeanName, factoryMethodName, Scope, lazyinit, InitMethodName, DestroyMethodName, Constructor arguments 과 같은 정보가 담긴다.
위와 같은 방법들로 스프링빈을 조회하고 사용할 수 있다
이전 포스팅 - 객체지향 설계- 스프링으로 전환 https://yulddong.tistory.com/10
객체지향 설계 - 스프링으로 전환
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다. 이전 포스팅에 있던 AppConfig 클래스를 스프링으로 전환해보겠다. -@Configuration은 스프링
yulddong.tistory.com
다음 포스팅 - 싱글톤 컨테이너:https://yulddong.tistory.com/12
싱글톤 컨테이너
싱글톤 패턴(디자인) 스프링 전환 이전의 AppConfig를 다시 한번 살펴보자 -위 AppConfig의 문제점은 호출할때마다 새로운 객체를 생성하고 반환하고 있어, 동시에 여러 요청을 처리하는 프로그램에
yulddong.tistory.com
이 포스팅은 스프링 핵심원리 - 기본편(By Inflearn 김영한님) 강의 및 강의자료를 참고하여 작성하였습니다.
'자바 스프링 > 스프링 핵심원리' 카테고리의 다른 글
컴포넌트 스캔 (0) | 2023.01.06 |
---|---|
싱글톤 컨테이너 (0) | 2023.01.05 |
객체지향 설계 - 스프링으로 전환 (0) | 2023.01.03 |
객체 지향 설계가 필요한 상황 (0) | 2023.01.03 |
객체 지향 설계와 스프링 (0) | 2023.01.02 |