我想将 JPA EntityManager 绑定(bind)到每个请求的当前线程(通过 ThreadLocal),这可以通过 ServletRequestListener 或 Filter 完成。听众看起来更干净,在这种情况下我不需要过滤器的额外可能性。但也许过滤器有一个我错过的优势。
我应该使用 Servlet 过滤器还是 ServletRequestListener 来做到这一点?
最佳答案
就您的目的而言,没有太大区别。但是从某种意义上说,监听器是“更干净”的,因为阅读您的代码的人会立即知道此代码的目的不可能是拦截请求或更改请求或执行过滤器可以执行的其他操作。
例如,Spring 使用 ServletRequestListener 来允许未使用 Spring 自己的 Web MVC 框架的基于 Web 的 Spring 应用程序仍然可以访问特定于 Web 的功能,例如 session 范围的 bean。参见 this doc .
编辑:为了更清楚,我提到了 Spring 的 RequestContextListener,因为它完全您所说的:创建一个 ThreadLocal 对象来存储可以在请求的其余部分访问的数据生命周期。
关于java - Servlet 过滤器与 ServletRequestListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1970285/