Java 如何在 SystemInitializer 类中使用 Spring Autowired

标签 java spring autowired

我有一个带有 Spring MVC 的 Java 项目。 我需要在应用程序初始化后启动 TimerTasks,因此我实现了 WebApplicationInitializer 接口(interface),并将其称为 SystemInitializer。在该类中,我有一个 @Autowired 属性,该 @Autowired 属性是一个 DAO 类。 我需要它,因为我想根据数据库中的记录执行一些任务。但 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 尚未准备好(尚未扫描)以进行注入(inject)。您的应用程序当时不知道 DomainResearchDao 是什么。

只有在应用程序初始化并创建所有(单例)实例(@Component@Service 等)后,Spring 才能 Autowiring bean。

<小时/>

如果您想在应用程序启动后执行某些操作,请使用 Spring Event 来执行此操作:

@Component
public class DoOnStart{

    @Autowired
    private IYourService service;

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

}

只需实现此类,无需 Autowiring 它。

关于Java 如何在 SystemInitializer 类中使用 Spring Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503372/

相关文章:

mysql - 运行spring boot应用程序时出错

java - 从 Spring 3.1.2 迁移到 4.1.6 后,DefaultListableBeanFactory Autowiring ,而不是自己实现

Spring @Configuration 类需要 Autowiring

java - Spring Autowiring 无法看到上下文 bean,除非在基础包上定义了组件扫描

java - OSGI 创建模块化 Web 应用程序

java - 如何知道我的手指在哪里、在哪个布局上?

java - Android回调方法

spring - 使用 JTA 批量插入(EntityManager 不能使用 getTransaction)

spring - 阴影包试图在 Java 7 中查找 java.time.LocalTime

java - 为什么会出现这些 Hazelcast 警告?