我想将JPA EntityManager绑定到每个请求的当前线程(通过ThreadLocal),可以通过ServletRequestListener或Filter完成。听众看起来更干净,在这种情况下我不需要过滤器的额外可能性。但也许过滤器有一个我错过的优势。
我应该使用Servlet过滤器还是ServletRequestListener来执行此操作?
答案 0 :(得分:7)
为了您的目的,没有太大的区别。但是听众是“更清洁”的,因为读取你的代码的人会立即知道这段代码的目的不可能是拦截请求或改变它或做其他过滤器可以做的事情。
例如,Spring使用ServletRequestListener来允许不使用Spring自己的Web MVC框架的Spring基于Web的应用程序访问特定于Web的功能,例如会话范围的bean。请参阅this doc。编辑:为了更清楚,我提到了Spring的RequestContextListener,因为它完全 你正在讨论的内容:创建一个ThreadLocal对象来存储可以在整个请求的其余部分访问的数据的生命周期。