@PersistenceContext private EntityManager em; springBoot 2.x 这里注入的是EntityManager的代理类,注入的代理类是单例的,所以是线程安全的 在调用EntityManager的方法时 其实是调用代理类
SharedEntityManagerInvocationHandler中的invoke方法
在这个类SharedEntityManagerCreator$SharedEntityManagerInvocationHandler中invoke方法中调用EntityManagerFactoryUtils.doGetTransactionalEntityManager获取en
public static EntityManager doGetTransactionalEntityManager( EntityManagerFactory emf, @Nullable Map<?, ?> properties, boolean synchronizedWithTransaction) throws PersistenceException
来到doGetTransactionalEntityManager方法入参 EntityManagerFactory emf 对象也是动态代理生成的AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler
调用emf对象的方法其实是调用下面方法
this.entityManagerFactoryBean.invokeProxyMethod(method, args);