
스프링 컨테이너 생성은 복잡하다. 어떤 메타데이터를 가지고 있는지 , 자바 코드는 어떠한 인터페이스를 적용하고 있는지 등에 따라 다른 형태로 인스턴스를 생성한다.
스프링 컨테이너가 애플리케이션의 객체를 어떻게 인스턴스화하고, 설정하고, 조합해야 하는지 지시하기 위한 정보를 설정 메타데이터(Configuration metadata)라고 한다.
인스턴스를 생성한 후에도 생성방법과 마찬가지로 등록된 빈을 가져오는 방법도 다르다.
2)메타데이터 설정 방법의 종류
ClassPathXmlApplicationContext,FileSystemXmlApplicationContext 은 XML의 형태에 메타 데이터에 적당하고
AnnotationConfigWebApplicationContext는 자바 코드를 통해 설정 메타 데이터를 정의 하는 웹 애플리케이션에 적합하다.
(1)자바 어노테이션 을 통한 설정 방법
@Configuration, @Bean 같은 어노테이션을 이용해서 설정하는 방법이다.
클래스에 @Configuration 설정하고 하나이상의 @Bean을 설정한 메서드가 1개 이상이 있어야 한다.
이러한 방법은 점점 변화해서 최근에는 대부분 어노테이션을 이용해서 설정한다.
package com.coffee;
import com.coffee.salespolicy.DiscountPolicy;
import com.coffee.salespolicy.RateDiscount;
import com.coffee.order.OrderService;
import com.coffee.order.OrderServiceImpl;
@Configuration
public class AppConfig {
@Bean(name="orderService")
public OrderService orderService(){
return new OrderServiceImpl(discountPolicy());
}
@Bean
public DiscountPolicy discountPolicy(){
return new RateDiscount();
}
}
2)xml을 통한 설정 방법
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"<http://www.springframework.org/dtd/spring-beans-2.0.dtd>">
<beans>
<bean id="orderService" class="comsam.spring02.DI01_Setter.OrderServiceImpl">
<property name="productName">
<value>아메리카노</value>
</property>
</bean>
<bean id="orderService1" class="comsam.spring02.DI02_Construct.OrderServiceImpl">
<constructor-arg value="아메리카노" />
</bean>
<bean id="orderService2" class="comsam.spring02.DI02_Construct.OrderServiceImpl">
<constructor-arg value="아메리카노" />
<constructor-arg value="23" />
</bean>
</beans>
3)BeanDefinition 인터페이스

4)BeanDefinition 정보
public class BeanDefinitionTest {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
// GenericXmlApplicationContext ac = new GenericXmlApplicationContext("appConfig.xml");
void findApplicationBean() {
String[] beanDefinitionNames = ac.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
BeanDefinition beanDefinition =ac.getBeanDefinition(beanDefinitionName);
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
System.out.println("beanDefinitionName" + beanDefinitionName +
" beanDefinition = " + beanDefinition);
}
}
}
}
4)스프링 컨테이너의 빈(Bean) 관리
스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다.
appConfig.class 나 appConfig.xml의 정보를 이용해서 등록한다.
ApplicationContext context =new ClassPathXmlApplicationContext("coffee.xml");
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
3)스프링 컨테이너에 있는 빈에 접근하기
4)빈 등록
5)DI(의존성 주입)