有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java根据请求参数自动连接RequestScope bean

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

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

  1. # 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);
    }
    

    这样可以消除代码重复,同时保证线程安全