static 메서드 또는 자바 에서 spring 빈 가져오기
스프링을 사용하다보면 부득이하게 “spring bean“을 일반 자바 또는 “static 메서드“로
선언된 곳에서 spring bean을 호출을 해야 하는 경우가 있습니다.
예를 들어서 “Servlet Filter“에서 “특정 spring bean”사용 한다 거나 특히, “유틸리티” 기능을
하는 클래스들(“주로 static으로 메서드가 선언된 클래스“)에서 사용할 경우가 대표적인
예라고 할 수 있습니다.
위와 같은 경우 어떻게 사용하는지에 대해서 “recipe“를 알려 드리겠습니다.
(1) 스프링 빈 설정
먼저 호출되어질 “스프링 빈“을 간단하게 설정하도록 하겠습니다.
SampleBean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | /* * Revision History * Author Date Description * ------------------ -------------- ------------------ * @beyondj2ee for twitter 2012. 12. 6 */ package pe.beyondj2ee.springframework.sample public class SampleBean { //~ Static fields/initializers ~ //~ Instance fields ~ //~ Constructors ~ //~ Implementation Method (interface/abstract) ~ //~ Self Methods ~ /** * 메세지를 리턴 한다. * * @return the string * @throws Exception the exception */ public String echo () throws Exception { return "My Bean!!!" ; } //~ Getter and Setter ~ } |
위의 클래스를 스프링 빈으로 설정 합니다.
bean.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 | <? xml version = "1.0" encoding = "UTF-8" ?> xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:tx = "http://www.springframework.org/schema/tx" xmlns:p = "http://www.springframework.org/schema/p" xmlns:oxm = "http://www.springframework.org/schema/oxm" xsi:schemaLocation="http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> < bean id = "sampleBean" class = "com.ucore2.migration.simulator.SampleBean" /> </ beans > |
(2) web.xml 설정
아래와 같이 “web.xml”에 스프링 컨텐스트를 설정 합니다.
여기서 중요한 부분은 “RequestContextListener” 리스너 입니다.
해당 리스너의 역할은 “현재 요청되어진 “HttpServletRequest” 객체의 레퍼런스
정보를 저장하는 기능을 갖고 있습니다.
즉 , current request에 대한 정보를 노출시켜주는 기능 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | < context-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath*:/bean.xml</ param-value > </ context-param > < listener > < listener-class > org.springframework.web.context.ContextLoaderListener </ listener-class > </ listener > < listener > < listener-class >org.springframework.web.context.request.RequestContextListener</ listener-class > </ listener > |
(2) utility 클래스 작성
“스프링 빈”를 호출해서사용하는 “utility 클래스” 입니다.
“RequestContextHolder” 클래스를 사용해서, 현재 요청한 “HttpServletRequest”
객체를 가져 옵니다.
나머지 코드는 기본적으로 스프링 빈을 가져오는 코드들 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | </pre> /* * Revision History * Author Date Description * ------------------ -------------- ------------------ * @beyondj2ee for twitter 2012. 12. 6 */ package pe.beyondj2ee.springframework.sample; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import org.springframework.web.context.support.WebApplicationContextUtils; /** * 메세지를 리턴하는 클래스. */ public class StaticUtil { //~ Static fields/initializers ~ //~ Instance fields ~ //~ Constructors ~ //~ Implementation Method (interface/abstract) ~ //~ Self Methods ~ /** * 메세지 정보를 리턴 한다. * * @return the message * @throws Exception the exception */ public static String getMessage () throws Exception { //현재 요청중인 thread local의 HttpServletRequest 객체 가져오기 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); //HttpSession 객체 가져오기 HttpSession session = request.getSession(); //ServletContext 객체 가져오기 ServletContext conext = session.getServletContext(); //Spring Context 가져오기 WebApplicationContext wContext = WebApplicationContextUtils.getWebApplicationContext(conext); //스프링 빈 가져오기 & casting SampleBean sBean = (SampleBean)wContext.getBean( "sampleBean" ); return sBean.echo(); } //~ Getter and Setter ~ } |
(2) controller 적용하기
컨트롤러에서 위의 “utility 클래스“를 호출 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /* * Revision History * Author Date Description * ------------------ -------------- ------------------ * @beyondj2ee for twitter 2012. 12. 6 */ package pe.beyondj2ee.springframework.sample; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller @RequestMapping("/static") public class BasicController extends AbstractController { // ~ Static fields/initializers ~ /** this logger. */ private static final Logger logger = LoggerFactory.getLogger(BasicController.class); // ~ Instance fields ~ // ~ Constructors ~ // ~ Implementation Method (interface/abstract) ~ // ~ Self Methods ~ /** * 기본 요청을 처리하는 컨트롤러. * * @return the model and view * @throws Exception the exception */ @RequestMapping (method = RequestMethod.GET) public void handleGET() throws Exception { logger.info( "message : " + StaticUtil.getMessage()); } // ~ Getter and Setter ============================================================================================== } |
Conclusion
해당 방법은 “HpptServletRequest” 객체를 참조하기 어려운 클래스에서 호출시에
좋은 “tip“이 될것 입니다. 참고로 “Web Application“에서만 해당 된다는 점을
유념 하시기 바랍니다.