Java 如何在 SystemInitializer class 中使用 Spring Autowired

Java How use Spring Autowired in SystemInitializer class

我有一个 Java 项目 Spring MVC。 我需要在我的应用程序初始化后启动 TimerTasks,所以我实现了 WebApplicationInitializer 接口并将其命名为 SystemInitializer。在那个class里面我有一个@Autowired属性,那个@Autowired属性是一个DAOclass。 我需要它因为我想根据我数据库中的记录执行一些任务。但是 Autowired 属性 永远是空的。

public class SystemInitializer implements WebApplicationInitializer {

@Autowired
private DomainResearchDao domainResearchDao;

@Override
public void run() {
    if (this.domainResearchDao != null) {
        System.out.println("OK");
    }
    // always here
    else{
       System.out.println("NO OK");
    }
}

您不能在 WebApplicationInitializer 中使用 @Autowired

您的 Bean 尚未准备好(尚未扫描)以供注入。您的应用程序当时不知道 DomainResearchDao 是什么。

Spring 只能在您的应用程序初始化并创建所有(单例)实例(@Component@Service 等)后自动装配 bean。


如果您想在应用程序启动后做一些工作,请使用 Spring 事件来执行此操作:

@Component
public class DoOnStart{

    @Autowired
    private IYourService service;

    @EventListener
    public void handleContextRefresh(ContextRefreshedEvent e) {
        // your CODE
    }

}

只需实现此 class,无需自动装配。