什么是正确的注解,这样我才能获得 Autowired EntityManagerFactory?

What is the correct annotation so I can get Autowired EntityManagerFactory?

我需要在我的 Spring 引导应用程序中使用的 class 中获取一个自动装配的 EntityManagerFactory。我认为问题是因为我的 class 在一个单独的包中。

我生成了一个简单的示例案例来说明我正在尝试做什么。

这是应用class:

package test;

import javax.persistence.EntityManagerFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import test2.GetEMF;

@SpringBootApplication
public class AutoWiredTest implements CommandLineRunner {
  @Autowired
  private EntityManagerFactory emf;

  @Override
  public void run(String... args) 
  throws Exception {
    if( emf == null )
      System.out.println("Top: EMF is null");
    else
      System.out.println("Top: Got EMF instance");      
    new GetEMF();
 }
  
  public static void main(String[] args) 
  throws Exception {
    SpringApplication.run(AutoWiredTest.class, args);
  }
}

这是另一个包中的 GetEMF class:

package test2;

import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import org.springframework.beans.factory.annotation.Autowired;

@PersistenceContext
public class GetEMF {
  @Autowired
  private EntityManagerFactory emf;
  
  public GetEMF() {
    if( emf == null )
      System.out.println("Inner: EMF is null");
    else
      System.out.println("Inner: Got EMF instance");      
  }
}

当我 运行 代码时,我得到这个输出:

Top: Got EMF instance
Inner: EMF is null

从网上看,我以为@PersistenceContext注解会填充emf,但不是。

我知道看起来我可以简单地将 emf 的引用传递给 GetEMF 构造函数,但这是简单测试用例的一个怪癖。它不适用于我的应用程序。我必须从环境中获取 EntityManagerFactory。

GetEMF中的emf字段是null因为您自己创建了实例:

new GetEMF();

如果你想Spring注入依赖,例如注入@Autowired字段,那么实例需要是一个由Spring管理的bean。

您可以使用 @Component 注释 GetEMF,然后将其自动连接到 AutoWiredTest