[인프런|Spring] 스프링 핵심 원리 – 기본편
스프링 핵심 원리 – 기본편
스프링 컨테이너와 스프링 빈
스프링 컨테이너 생성
//스프링 컨테이너 생성
ApplicationContext applicationContext =
new AnnotationConfigApplicationContext(AppConfig.class);
- ApplicationContext : 스프링 컨테이너, 인터페이스임(다형성)
- new AnnotationConfigApplicationContext(AppConfig.class) 로 config 정보를 준다.
- 그러면 스프링 컨테이너가 만들어진다.
- 스프링 컨테이너 안에는 빈 저장소가 있다.
-
appconfig.class의 구성 정보를 통해 채우게 되는 것이다.
- 스프링 빈을 AppConfig.class정보를 통해 등록한다.
-
빈의 이름과 객체를 담는데, 빈 이름은 메서드 이름을 사용하고, @Bean(name=””) 으로 이름을 직접 부여할 수도 있다.
-
단, 항상 다른 빈 이름을 사용하여야 한다~!!!!!!!!!!!!!!!
컨테이너에 등록된 모든 빈 조회
@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(빈이름, 타입)
-
ac.getBean(타입)
- 조회 대상 스프링 빈이 없으면 예외 발생 NoSuchBeanDefinitionException: No bean named ‘xxxxx’ available
스프링 빈 조회 - 동일한 타입이 둘 이상
- ac.getBean(빈이름, 타입)
MemberRepository memberRepository = ac.getBean("memberRepository1",
MemberRepository.class)
스프링 빈 조회 - 상속관계
- 부모 타입으로 조회하면, 자식 타입도 함께 조회한다.
- 그래서 모든 자바 객체의 최고 부모인 Object 타입으로 조회하면, 모든 스프링 빈을 조회한다.
BeanFactory와 ApplicationContext
BeanFactory
- 스프링 컨테이너의 최상위 인터페이스다.
- 스프링 빈을 관리하고 조회하는 역할을 담당한다.
- getBean() 을 제공한다.
- 지금까지 우리가 사용했던 대부분의 기능은 BeanFactory가 제공하는 기능이다.
ApplicationContext
- BeanFactory 기능을 모두 상속받아서 제공한다.
- 빈을 관리하고 검색하는 기능을 BeanFactory가 제공해주는데, 그러면 둘의 차이가 뭘까?
- 애플리케이션을 개발할 때는 빈을 관리하고 조회하는 기능은 물론이고, 수 많은 부가기능이 필요하다.
차이점?
XML 설정
- 최근에는 스프링 부트를 많이 사용하면서 XML기반의 설정은 잘 사용하지 않는다.
스프링 빈 설정 메타 정보 - BeanDefinition
-
AnnotationConfigApplicationContext 는 AnnotatedBeanDefinitionReader 를 사용해서 AppConfig.class 를 읽고 BeanDefinition 을 생성한다.
-
GenericXmlApplicationContext 는 XmlBeanDefinitionReader 를 사용해서 appConfig.xml 설정 정보를 읽고 BeanDefinition 을 생성한다.
-
새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서 BeanDefinition 을 생성하 면 된다.