2010년 3월 22일 월요일

PropertyPlaceholderConfigurer 활용 방법

스프링에서 config로 되어 있는 properties를 사용할때
"PropertyPlaceholderConfigurer"를 사용 합니다.
이 클래스는 해당 경로에 있는 properties 파을을
읽어서 스프링 xml 안에서 Ant 변수처럼 사용 해서
value값을 injection 해주는 클래스 입니다.
하지만 가끔 이 클래스를 빈으로 설정 할때
"ContextLoaderListener"으로 선언된 ApplicationContext
에서는 사용이 가능하지만 "DispatcherServlet" 으로
선언된 ApplicationContext에서는 인식이 안되는
문제가 발생 합니다.
이러한 문제가 무엇이면 해결 방법에 대해서 말씀
드리겠습니다.

  • PropertyPlaceholderConfigurer 이해

먼저 "PropertyPlaceholderConfigurer" 클래스를 이해 하기 위해서

ApplicationContext에 대해서 간략 하게 설명 드리겠습니다.
WebApplication에서 ApplicationContext가 한 개이상
존재 할 수 있습니다.
첫 번째는 "ContextLoaderListener" 클래스를 통한 생성과
두번째는 "DispatcherServlet" 클래스를 통한 생성 입니다.
그리고 아래의 그림 처럼 "DispatcherServlet"로
생성된 ApplicationContext가 "ContextLoaderListener"으로
생성된 ApplicationContext를 참조 하고 있습니다.
즉 부모(listener)-자식(servlet) 관계 입니다.


"PropertyPlaceholderConfigurer" 클래스는 각 ApplicationContext
가 load시 위 의 클래스를 lookup 합니다. 만약 존재하면
명시된 경로의 properties 파일들을 읽어서 참조 하는 빈들의
value값에 injection 합니다.
다시 말해서 ApplicationContext마다 한개씩 존재 해야
합니다.WebApplication에서는 최소 2개 이상
필요 합니다.
위에서의 문제점은 "ContextLoaderListener" 로드된
ApplicationContext에만 설정을 하고 Servlet으로 로드된
Context에는 설정을 하지 않았기 때문에 인식이
되지 않은 것입니다.

  • 해결 방법
web.xml



<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/spring/application/spring.cfg.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>springDispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:/spring/application/spring.mvc.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

spring.cfg.xml

<bean id="beyondj2ee.configPath" class="java.lang.String">
<constructor-arg index="0" type="java.lang.String"
value="classpath*:/**/*.properties" />
</bean>
<!-- application context placeholder -->
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
ref="beyondj2ee.configPath" />

spring.mvc.xml
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
ref="beyondj2ee.configPath" />

<bean id="beyondj2ee.testBean" class="org.beyondj2ee.core.bean.TestBean">
<property name="url" value="${jdbc.datasource.url}" />
</bean>

test.properties
jdbc.datasource.url=xxxxxxx

"spring.cfg.xml"에서 String 빈을 설정 한 이유는 경로를 집중화
하기 위해서 사용 했습니다.
properties 파일이 추가 되거나 수정 할경우 한 곳에서만
관리 하기 위해서 입니다.

댓글 없음:

댓글 쓰기