2013-12-16 1 views
1

로컬로 초기화 된 REST web service controller's 웹 메소드에서 객체가 올 수 있습니다.Spring MVC 3에서 팩토리 패턴을 사용하여 Bean 인스턴스화

@RequestMapping(method = RequestMethod.POST,value = "/test",headers="Accept=*/*") 
    public @ResponseBody ModelAndView computeDetails(@RequestBody RequestObj reqObj, ModelMap model) { 

     System.out.println(reqObj.getcode()); 

     return new ModelAndView("responsedetails", "object", reqObj); 
    } 

이 RequestObj 객체는 팩토리를 사용 종속성을 인스턴스화 키 code을 보유하고 있습니다.

BaseCode 인터페이스를 구현하는 다른 코드 클래스가 정의되었습니다.

팩토리 메소드를 사용하여 내 서비스 빈에서 BaseCode 유형으로 들어오는 코드 값을 기반으로 특정 코드 클래스를 인스턴스화하는 방법은 무엇입니까?

아이디어가 있으십니까? 미리 감사드립니다.

답변

0

-

방식으로 ServletContextAware 같은 공장 확인을 currentContext를 취득합니다. 그리고 봄이 의존성을 주입하도록 스프링 컨텍스트에 콩의 상속을 정의

WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); 

ctx.getBean(classNameToBeInstantiated); 

으로 getInstance 메소드를 정의합니다.

0

내가 당신의 문제를 잘 이해하고 있는지는 잘 모르겠지만, 일반적으로 봄 의존성은 여기서 할 일이 없다. reqObj.getcode()에 따라 사용자 정의 Factory 클래스를 작성하고 BaseCode 구현을 리턴하십시오.

+0

HI czajek, 문제는 reqObj가이 메소드의 로컬 인 스프링 컨텍스트로 인스턴스화되지 않습니다. 이 로컬 객체의이 키를 Custom Factory 클래스에 전달하려면 어떻게해야합니까? – AmitN

1

내가 보통의 경우에 할 것은 :

  1. 공장의 방법 getBaseCode(String code)을 만들 Spring의 콩
  2. 를 사용하여 컨트롤러에 공장을 주입 (참고 : String 여기에 코드 유형을 의미합니다 그래서 실제 구현
  3. SU를 구성하는 동안 BaseCode 인터페이스를 반환 getBaseCode을하지 않을 경우 String
  4. 실제 코드 유형을 사용 당신이 BaseCodeexecute 방법이 pposing, 실제 행동


나는 당신이 할 수있는 생각 첫 번째 점을 (무시를 수행 할 수있는 진정한 협력자를 얻을 수있는 컨트롤러로 getBaseCode 방법을 사용하고 execute 메소드를 호출

: computeDetails이 유사하게하면서 쉽게 공장) 어떤 봄 튜토리얼에서 찾고

public class BaseCodeFactory { 
    public BaseCode getBaseCode(String code) { 
    if(code.equals("something")) return new ThisBaseCodeImpl(); 
    else //and so on 
    } 
} 

같은 것

@RequestMapping(method = RequestMethod.POST,value = "/test",headers="Accept=*/*") 
public @ResponseBody ModelAndView computeDetails(@RequestBody RequestObj reqObj, ModelMap model) { 
    //... 
    factory.getBaseCode(reqObj.getcode()).execute(); 
    //... 
} 

보조 메모로 여기에서 선택하는 이름과 같은 이름으로 이동하지 않습니다. 귀하의 도메인에서 좀 더 의미있는 것을 찾아 보시기 바랍니다. (BaseCode은 의미가 없습니다.)이 스 니펫을 지침 .

기본 OP 댓글. 당신은 당신이 new ThisBaseCodeImpl(/*args if you like*/)의 빈은 Spring에 의해 인스턴스화 사용하는 경우, 다른 스프링 빈 그래서 @Configurable에 당신이 할 수있는

  1. 주석을 사용합니다 ThisBaseCodeImpl이있는 경우. 내 의견으로는,이 솔루션을 개인적으로 좋아하지 않는다. 숨겨진 스프링 빈을 사용하여 코드를 오염시킨다. 반면에 런타임 컨스트럭터 인자와 스프링 빈을 모두 관리 할 수 ​​있기 때문에
  2. ThisBaseCodeImpl을 스프링 컨텍스트에 추가하고 팩토리를 변경하여 ThisBaseCodeImpl의 공동 작업자를 삽입 할 수 있으므로 매우 유연합니다.

1 점 예 :

@Configurable 
public class ThisBaseCodeImpl { 
    @Resource 
    private Bean bean; 
} 

2 점 예 :

나는 이런 식으로 한
public class BaseCodeFactory { 
    @Resource 
    ThisBaseCodeImpl thisBaseCodeImpl; 

    public BaseCode getBaseCode(String code) { 
    if(code.equals("something")) return thisBaseCodeImpl; 
    else //and so on 
    } 
} 
+0

그래,하지만이 경우에는 ThisBaseCodeImpl에 대한 의존성 주입은 Spring에서 처리하지 않을 것이다. 그것은 단점입니다. 나는 WebApplicationContext getbean 메소드를 사용하여 빈을 인스턴스화 할 수 있었다. 따라서 종속성은 봄에 의해 관리됩니다. – AmitN

+0

@AmitN, 죄송 합니다만, 당신이'BaseCode' 구현체가 Spring에 의해 관리되는 의존성을 갖길 원했던 것은 분명하지 않았습니다. 귀하의 사례에 대해 가능한 다른 두 가지 해결책을 제공하기 위해 제 답변을 업데이트 할 것입니다. – ThanksForAllTheFish

관련 문제