@Autowired 服务为空,但我需要创建新实例

@Autowired service is null but I need create new instance

我正在开发一个带有 Spring 启动的应用程序,我使用的是 MVC 模型。 我有一个名为 A 的实体,它有自己的控制器、服务和存储库。好的,在这里。

我有一个实用程序 class,它 运行 可用并在服务器启动时调用。此实用程序 class 创建一组 A 实体,然后将其存储到数据库中。问题是 class 的 autowired 服务为空,因为我创建了实用程序 class 的新实例以便 运行 它,所以 Spring 没有正确创建自动装配服务。

即:

Main.java

@SpringBootApplication
public class MainClass {

    public static void main(String[] args) {
    ...
    Runnable task = new Utility();
    ...
}
}

Utility.java

@Autowired
private Service service;
...
public void run() {
   ...
   service.save(entities);      <-- NPE
}

我知道 Spring 无法自动连接这个新实例的服务,但我需要创建实用程序实例才能 运行 它。

我试过通过application context访问服务,问题还是一样:

 @Autowired 
 private ApplicationContext applicationContext;

我已经尝试 运行 启用控制器(服务已正确自动连接),但问题是一样的,因为我需要执行 new controller();.

我已阅读这些帖子 post 1 ,但任何解决方案都有效。

更新:我需要在新线程中执行任务 运行,因为它将每 X 小时执行一次。该任务从 Internet 下载数据集并将其保存到数据库中。

如果我没理解错的话,你是在试图用虚拟数据填充你的数据库。

This utility class create a set of A entities, and then, stored it into database

为什么要使用 Runnable?这个任务 运行 是通过一个新的 Thread 完成的吗?
如果没有,那么在你的 @Controller 中使用 @PostConstruct,它可以访问右边的 @Service。标记的方法保证在Bean完全构造完成,并且其所有依赖都满足后被调用。

@PostConstruct
private void persistEntities() {
   ...
   service.save(entities);
}

如果你在 Spring 启动,你可以在 src/main/resources/ 下放置一个 data-*.sql 文件。启动时它将是 运行。

如果您需要定期做一些任务:

@SpringBootApplication
@EnableScheduling
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}

@Component
class Runner {

    @Autowired
    private Service service;

    @Scheduled(cron = "0 */2 * * * ?") // execute every 2 hours
    public void run() {
        // put your logic here
    }
}

正如@CoderinoJavarino 在评论中所说,我需要使用 @Scheduled 可运行实例 class。

有了计划,Spring 可以正确地自动装配服务。所以,最后,我最初的可运行实用程序 class 变成了预定的 class。