2010년 3월 18일 목요일

Spring Annotation 설정시 유의 사항

Spring을 Web Application에서 사용할때 ApplicationContext가
두개의 Context로 관리 됩니다.
각각의 ApplicationContext 설정 방법중
하나는 ServletListener를 구현한 "ContextLoaderListener"
와 나머지 하나는 Servlet을 구현한 "DispatcherServlet"
입니다.

 <listener>
<listener-lass>org.springframework.web.context.ContextLoaderListener
</listener-lass>
</listener>
.....
<servlet>
<servlet-name>webAppServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/webapp-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

이 두 ApplicationContext는
부모(ContextLoaderListener)-> 자식(DispatcherServlet)
관계로 되어 있습니다.
이런 구조를 가지고 있어서 주로 부모 ApplicationContext
에는 Service,DAO,DataSource,Transaction 클래스들을
설정하고 자식 ApplicationContext에는
Controller를 설정 합니다.

※단 부모에서는 자식을 참조 할수 없음

스프링을 설정할때 Annotation을 설정하려면 아래와
같이 설정을 해야 합니다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:annotation-config/>
</beans>


하지만 위와 같은 선언은 반드시 같은 ApplicationContext
에 위치하는 것에만 적용이 됩니다.
즉 "DispatcherServlet"에 위와 같은
xml을 설정하게 되면 "@Autowired"를 통해서
빈을 검색할때 부모 ApplicationContext에 존재하는 빈들을
참조 할 수 없습니다.
즉 Service,DAO 빈들을 참조 할 수 없다는 얘기 입니다.
그래서 반드시 저 선언은 "ContextLoaderListener" 에
선언을 해야 합니다.
참고 하시기 바랍니다.

댓글 없음:

댓글 쓰기