在弹簧控制器中,我可以执行以下操作:

@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);
}


这样,您就可以在确保线程安全的同时消除代码重复。

10-08 14:44