基于请求参数自动装配请求范围的bean

时间:2015-01-17 09:19:44

标签: java spring spring-mvc autowired

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

@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 个答案:

答案 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);
}

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