EntityManager
是非线程安全的定义。 Servlets规范说,在非分布式环境中并且没有实现SingleThreadModel
,每个定义只有一个servlet实例。@PersistenceContext EntityManager在Spring和Java EE中的线程安全性
因此,在Java EE当你注入的EntityManager
通过@PersistenceContext
成Servlet的领域 - 这不是线程安全的:
public class MyServlet extends HttpServlet {
// Not thread-safe, should be using EMF instead.
@PersistenceContext
private EntityManager em;
}
这是正确的说,尽管Spring bean的默认范围是单身人士,
EntityManager
是线程安全的,因为Spring使用ThreadLocal
来绑定其交易并且EntityManager
它?上面的Servlets示例在Spring中是否仍然有效?它仍然不是线程安全的吗?
ThreadLocal
方法仅适用于Spring托管的bean,而普通的servlet不是其中之一吗?据我记忆,注射
EntityManager
是集装箱的责任。在Glassfish Java EE实现中,应用服务器发现@PersistenceContext
作为注入点。
它在春天看起来如何? Spring框架是否负责发现这些注释或者它是JPA实现者的责任?
谢谢拉尔夫。所以,通过说“2)不是”,你的意思是说它不是线程安全的,因为这个servlet不是一个Spring bean,所以实际上**不会发生任何注入**?是否有可能将这样的Servlet标记为Spring bean?我以某种方式觉得这是非常罕见的,不推荐的和凌乱的想法 - 这只是理解Spring的机制的理论问题。 –
我的意思是它根本就不是Spring bean(这是关于第一段的内容),所以没有注入,而'em'将为空。 - 测试它,如果它不是null,那么真的很奇怪。你可以尝试使它成为spring bean的一种方法是“@ Configurable”,但这需要真正的AspectJ,我真的不知道这是否适用于Servlet。 – Ralph