在弹簧控制器中,我可以执行以下操作:
@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);
}
或者是否有更好的方法来封装常见的参数,例如?
答案 0 :(得分: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);
}
这样就可以在保证线程安全的同时消除代码重复。