applicationContext?
어플리케이션에서 IoC를 적용해서 관리할 모든 오브젝트에 대한 생성과 관계설정을 담당한다. ApplicationContext은 오브젝트 생성, 관계설정, 만들어지는 방식, 자동생성, 후처리등 여러가지 일들을 한다.
BeanFactory를 상속받고 있다.
ApplicationContext가 Bean을 가져오는 동작방식
-
ApplicationContext는 앞의 @Configure 가 붙은 DaoFactory 클래스를 설정정보로 등록해두고 @Bean이 붙은 메소드의 이름을 가져와 Bean 목록을 만든다.
-
클라이언트가 ApplicationContext의 getBean메소드를 호출하면 Bean 목록에서 요청한 이름이 있는지 찾는다.
-
있다면 Bean을 생성하는 메소드를 호출해서 오브젝트를 생성시킨 후 클라이언트에게 리턴해 준다. (스프링에서 관리되는 Bean들이 기본 생성자가 필요한 이유)
@Configure가 없는 일반적인 DaoFactory같은 오브젝트 팩토리를 직접 사용했을 때와 비교해서 ApplicationContext를 사용했을 때 얻을 수 있는 장점은 아래와 같다.
- 클라이언트는 구체적인 팩토리 클래스를 알 필요가 없다.
- 어플리케이션이 확장이 되면 DaoFactory같은 오브젝트 팩토리도 계속 추가될 것이다. 클라이언트는 필요한 오브젝트를 가져오려면 어떤 오브젝트 팩토리를 이용해서 가져와야 하는지 알고 있어야 하고 필요할 때마다 오브젝트 팩토리를 생성해야 하는 번거로움이 있다. ApplicationContext를 이용하면 클라이언트는 ApplicationContext만 알고 있으면 된다.
-
ApplicationContext의 역할은 단지 오브젝트 생성과 다른 오브젝트와의 관계 설정만이 전부가 아니다. 이외에도 ApplicationContext는 다양한 기능들을 제공한다.
- ApplicationContext는 Bean을 검색하는 다양한 방법을 제공한다. (Bean의 이름, 타입, Annotation 등)
보통 어플리케이션컨텍스트를 사용하는데 빈이 처음부터 생성 되는지 확인해주기때문이다.
빈과 빈의 관계, 메모리 올라가는것을 초기에 검사할 수 있다.
beanFactory?
스프링의 BeanFactory 는 실제 Bean들을 생성 관리하는 주체이다. BeanFactory는 ApplicationContext 에서 따로 생성하고 있다.
ApplicationContext는 Pre-loading을 하고 즉, 즉시 인스턴스를 만들고 BeanFactory는 lazy-loading을 하여 실제 요청 받는 시점에서 인스턴스를 만든다고 한다
Bean의 lifecycle
beanfactoryAware
beanfactoryAware 쓰면 pojo가 아니게 되며 spring에 종속적이 된다.
빈 객체를 직접 사용해야 할때
pojo란?
pojo 특정 기술에 종속되지않는 객체
서블릿은 http서블릿을 상속받기에 pojo가 아니다
Xml? Javaconfig
1. 생성자를 통한 Bean 생성
아래와 같이 class를 명시함으로 사용가능하다.
<bean id="exampleBean" class="example.ExampleBean"/>
이렇게 함으로써 디폴트 생성자를 통해 Bean이 생성된다.
2. Setter를 통한 Bean 생성
<bean id="example" class="example.ExampleBean">
<property name="beanOne"><ref bean="anotherExampleBean"/></property>
<property name="beanTwo"><ref bean="yetAnotherBean"/></property>
<property name="integerProperty"><value>1</value></property>
</bean>
<bean id="antherExampleBean" class="example.AnotherBean"></bean>
<bean id="yetAnotherBean" class="example.YetAnotherBean"></bean>
Public class ExampleBean{
private AnotherBean beanOne;
private YetAnotherBean beanTwo;
private int i;
public setBeanOne(AnnotherBean beanOne){
this.beanOne = beanOne;
}
public setBeanTwo(YetAnnotherBean beanTwo){
this.beanTwo = beanTwo;
}
public setIntegerProperty(int i){
this.i = i;
}
}
Di 쪽에 관련 예제가 있을 것이다.