2011-02-18 7 views
2

스프링 지식이 부족하기 때문에 범위 bean 의존성에 대해 심각한 의문점이 있습니다.스프링 MVC 범위가 지정된 Bean 의존성 및 경쟁 조건

3.5.4.5 Scoped beans를 의존성으로 읽었으며 관련 예제를 성공적으로 구현했습니다.

그러나 더 많은 것을하기 전에, 나는 나의 관심사를 공유하고 싶었다.

것은 내 사용 사례 및 작은 구현 세부 사항 I 사용자 당에 대한 도시를 만들려는 각 사용자 요청에 대한

을 공유합시다. 나는 싱글로이 도시를 주입 할 각 요청에 대해

@Configuration 
public class CityFactory{ 

    @Bean(name = {"currentCity" , "loggedInCity"}) 
    @Scope(value = WebApplicationContext.SCOPE_REQUEST,proxyMode = ScopedProxyMode.TARGET_CLASS) 
    @Autowired 
    public CityBean getCityBean(HttpServletRequest request) { 
     return CityUtil.findCityWithHostName(request.getServerName()); 
    } 

는 컨트롤러에 대한 기본 범위입니다 컨트롤러 범위.

@RequestMapping("/demo") 
@Controller 
public class DemoController { 

    @Autowired 
    CityBean city; 

    @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET) 
    public ModelAndView helloWorld(@PathVariable("name") String name, Model model) { 
     Map<String, Object> myModel = new HashMap<String, Object>(); 
     model.addAttribute("hello", name); 
     model.addAttribute("test", "test in " + city.getDomainName() + " !!! "); 

     return new ModelAndView("v3/test", "m", model); 
    } 
} 

내 질문 :

1) 어떤 경쟁 조건이 있습니까? 다중 요청 환경에서 내 응용 프로그램을 파괴 할 수있는 컨텍스트 전환이 걱정됩니다.

2) 요청 당 컨트롤러를 만드는 또 다른 솔루션을 알고 있지만 현재 솔루션보다 오류가 발생하기 쉽습니다. 다른 개발자가 범위를 지정하는 컨트롤러를 잊어서 요청할 수 있기 때문입니다.

어떻게 컨트롤러가 전체 범위를 요청하도록 할 수 있습니까? 그냥 조금 호기심이 있기 때문에.

감사합니다 ...

답변

0

없음 경쟁 조건 - 각 요청은 자체 스레드

을 가지고하지만 난 당신이 원하는 것을 할 수있는 쉬운 방법이 있다고 생각. 당신은 몇 가지를 사용하는 경우 (

  • @Autowired CityBean bean
  • 방법에 대한 인수로 통과 HttpServletRequestcityBean.getDomainName(request.getServerName());

전화 :

@Service 
public class CityBean { 
    public String getDomainName(String serverName) { 
     // obtain the name based on the server name 
    } 
} 

그리고 컨트롤러에

: 당신은 당신이 CityBean 수 있습니다 ORM, 아마도 당신은 City 엔티티를 가질 수 있습니다.이 엔티티는 가져 오기와 전달이 가능하며, 게으른 콜렉션에만주의하십시오.)

+0

CityBean 클래스는 다른 기존 라이브러리에서오고있다. 너무 귀하의 제안 주셔서 대단히 감사합니다. – Ozgur

0

여기에는 경쟁 조건이 없습니다. 범위 프록시의 요점

- 있도록 DemoController에 주입 CityBean의 인스턴스가있는 대표 CityBean의 실제 요청 바인딩 인스턴스의 메소드의 호출 프록시이며, 각 요청은 CityBean 자체와 함께 작동합니다.

컨트롤러 자체를 요청 범위로해서는 안되는 데 동의합니다. 이는 스프링 MVC 애플리케이션에서 일반적인 접근 방식이 아니기 때문에 다른 사람들에게 혼동을 줄 수 있습니다.당신은 또한 접근 방식을 따를 수

은 Bozho에 의해 제안하고 컨트롤러 메소드에 추가 인수를 추가해야하기 때문에이 방법은 단점이있다하더라도, 모든 요청 범위의 빈을 제거.