2015-01-17 103 views
0

在彈簧控制器的請求作用域的bean,我可以做到以下幾點:自動裝配基於請求參數

@Controller 
public class FooController { 

    @Autowired 
    private FooServiceFactory factory; 

    @RequestMapping("foo") 
    public Foo createFoo(@RequestParam String kind, @RequestParam String id) { 
     FooService service = factory.getFooService(kind); 
     return service.get(id); 
    } 
} 

現在,如果我有很多的說了一kind,並開始與FooService service = factory.getFooService(kind);方法,那麼能夠將所有這些邏輯移出到控制器將是很好的。

控制器中是否有其他地方可以訪問請求參數?

是否有有效地說某種方式(我在這裏做了語法):

private FooService service; 

@Autowired 
public setKind(@RequestParam String kind) { 
    service = factory.getFooService(kind); 
} 

或者是有共同封裝等參數,因爲這一些更好的辦法?

回答

1

如果你使用一個實例變量來存儲FooService你必須確保你實現了FooService並考慮到線程安全性。所以最好的事情是不使用以下編碼風格。

private FooService service; 

@Autowired 
public setKind(@RequestParam String kind) { 
    service = factory.getFooService(kind); 
} 

你可以做的是;

private FooService _getFooService(String kind) { 
    return factory.getFooService(kind); 
} 

並將其用於所有控制器中;

@RequestMapping("foo") 
public Foo createFoo(@RequestParam String kind, @RequestParam String id) { 
    return _getFooService(kind).get(id); 
} 

這樣可以消除代碼重複,同時保證線程安全。