JFinal框架中,每次请求的Controller都是通过反射新建的, 可否换种方式?

controller = .getController(action.getControllerClass())

之前经常听到有人说,JFinal中每个请求的Controller都是new出来了,可以通过ActionHandler中上面这行代码发现。可以换成下面那种方式吗?

Map<Class<? extends Controller>, Controller> controllerMap = 
new ConcurrentHashMap<Class<? extends Controller>, Controller>();
Class<? extends Controller> clazz = action.getControllerClass();
Controller t = controllerMap.get(clazz);
if (t == null) {
    t = (Controller) clazz.newInstance();
    controllerMap.put(clazz, t);
}

先构建一个Map,然后每次从controllerMap获取需要的Controller对象?这样会导致同一个Controller中的请求都只有一个Controller对象,这样设计是否存在并发问题?

评论区

JFinal

2018-06-22 16:34

必然会有并发问题, controller 中持有很多对象,例如 request、response 等等

正确的做法是:
me.setControllerFactory(new FastControllerFactory())
这样就可以避免每次都 new 出来新的 controller 了,而是每个线程在多次请求时只 new 出来一个

maxwade

2018-06-22 19:05

@JFinal 理解了,如果只有一个controller的话,不同的请求结果一样的request response,但是不同的请求里面的请求返回数据都不一样,所以会有并发问题。我在看看me.setControllerFactory(new FastControllerFactory()) 这里面怎么实现的,就可以更进一步理解了。

热门反馈

扫码入社