2013-07-24 4 views
0

저는 봄에 웹 애플리케이션을 만들고 있습니다. 응용 프로그램은 특성 파일로 구성됩니다. 서로 다른 서버에 응용 프로그램의 인스턴스가 여러 개 있습니다. 각 인스턴스마다 다른 구성 파일이 있습니다. 각 인스턴스는 다른 고객에 맞게 사용자 지정됩니다. 컨트롤러와 서비스를 사용하고 있습니다. 다음과 같은 내용 :요청 객체에 따른 스프링 의존성 주입

public class Controller1 { 
    @Autowired 
    Service1 service1; 

    @RequestMapping(value = "/page.htm", method = { RequestMethod.GET, RequestMethod.POST }) 
    public ModelAndView serve(HttpServletRequest request, HttpServletResponse response) { 
     service1.doSomething(); 
     return new ModelAndView("/something"); 
    } 
} 

@Service 
public class Service1 { 
    @Autowired 
    Service2 service2; 
    public void doSomething() { 
      … 
      service2.doAnotherThing(); 
      … 
     } 
} 

@Service 
public class Service2 { 
    @Value("${propertyValue}") 
    private String propertyValue; 

    //doAnotherThing() will use propertyValue 
    public void doAnotherThing() { 
     … 
     //Do something with propertyValue 
     … 
     } 
} 

이제 새로운 요구 사항이 생겼습니다. 각 고객에 대해 여러 개의 인스턴스가 없지만 모든 고객에 대해 여러 개의 도메인이있는 인스턴스는 하나만 있습니다. 응용 프로그램은 컨트롤러의 요청 개체의 호스트 이름에 따라 구성을 결정해야합니다. 따라서 고객이 브라우저를 www.app1.com으로 지정하면 구성 파일 1을 사용해야하지만 고객이 www.app2.com을 사용하면 구성 2를 사용해야합니다.

구성 파일을 데이터베이스로 이동했지만 종속성 삽입 방법을 모르는 것을 깨달았습니다. 서비스는 연결되어 있으며 service1은 service2를 사용하고 service2는 구성에 따라 값을 사용해야합니다. 서비스 2는 요청 객체에 대한 지식이 없습니다.

해결 방법이 있습니까?

<bean id="customerAConfig"../> 
<bean id="customerBConfig"../> 
<bean id="customerCConfig"../> 

그리고 세션이 configuartion이 활성화되는 포인터 역할을 ConfigurationService을 범위가 있습니다

덕분에,

답변

1

한 가지 방법은 스프링 설정에 싱글로 모든 고객을 위해 구성 개체를 만드는 것입니다

public class ConfigurationService { 

    private CustomerConfig activeConfig; 

    // getters & setters.. 
} 

싱글 톤 구성 요소에 삽입 할 수 있도록이 서비스에 대한 싱글 톤 프록시를 스프링 구성에 구성하십시오.

<bean class="com.mycompany.ConfigurationService" scope="session"> 
    <aop:scoped-proxy/> 
</bean> 

그리고 로그인 컨트롤러의 구성이 가상 호스트 이름을 사용해야 선택하는과 (ConfigurationService가 기억 나중에 검색을 위해 ConfigurationService로 저장 : 당신은 봄이 프록시를 생성하는 클래스 패스에 CGLIB이 필요합니다 세션은 다음

public class LoginController { 

    @Autowired private CustomerConfig[] custConfigs; 
    @Autowired private ConfigurationService configService; 

    @RequestMapping(method = POST) 
    public String login(HttpServletRequest request, ..) { 
    ... 
    String host = request.getServerName(); 
    CustomerConfig activeConfig = // decide which one based on host.. 
    configService.setActiveConfig(activeConfig); 
    ... 
    } 
} 

이 프로그램 경우 고객의 특정 구성

@Controller 
@RequestMapping("/foo") 
public class FooController { 

    @Autowired private ConfigurationService configService; 

    @RequestMapping(method = "GET") 
    public String get() { 
    ... 
    CustomerConfig config = configService.getActiveConfig(); 
    ... 
    } 

    ... 
} 

를 읽고 샘플 FooController입니다) 범위 로그인 페이지와 같은 단일 진입 점이 없으면 유사한 논리를 필터로 코딩 할 수 있습니다. 세션에서 활성 구성이 설정되어 있는지 확인하십시오. 호스트 이름을 기반으로 조회하지 않을 경우