在弹簧控制器中,我可以执行以下操作:
@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);
}
还是有一些更好的方法来封装诸如此类的通用参数?
最佳答案
如果使用实例变量存储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);
}
这样,您就可以在确保线程安全的同时消除代码重复。