为什么从另一个类调用使用自动装配对象的方法时,该对象为null?

时间:2019-08-03 05:58:19

标签: java spring spring-boot autowired

我正在做一个Spring Boot 2.1.6项目。

当我有一个自动连接的对象ScheduledTasks时,我有了一个类db,该对象使我可以访问jdbcTemplate以便执行查询。当我从另一个文件main调用start时,db对象为null。如果我将start方法直接放在主类db中,则该方法不是null。

我不确定是什么问题。我在@Component中放置了ScheduledTasks注释,以便Spring知道我的自动装配对象。我想念什么?

这是我的ScheduledTasks

@Component
public class ScheduledTasks {
    private Logger log = VastLogger.getLogger(TrackingEventController.class);

    @Autowired
    private DBHandler db;

    public void start() {
        if (db == null) {
            log.info("db is null from parent");
        }
    }
}

这是我的主要课程:

@SpringBootApplication
@EnableJms
public class ServerMain implements CommandLineRunner {
    private static final Logger log = LogManager.getLogger(ServerMain.class);

    @Autowired
    private DBHandler db;

    public static void main(String[] args) {
        log.warn("from main");
        ConfigurableApplicationContext context = SpringApplication.run(ServerMain.class, args);

    }

    @Override
    public void run(String... strings) throws Exception {
        log.info("starting run");
        db.initDBTables();
        ScheduledTasks tasks = new ScheduledTasks();
        tasks.start();
    }

1 个答案:

答案 0 :(得分:4)

您正在使用ScheduledTasks创建new。在这种情况下,您将不会使用spring创建的对象,因此自动装配将不起作用。您还应该在主类中连接ScheduledTasks对象。

@SpringBootApplication
@EnableJms
public class ServerMain implements CommandLineRunner {
    private static final Logger log = LogManager.getLogger(ServerMain.class);

    @Autowired
    private DBHandler db;

    @Autowired
    private ScheduledTasks tasks;

    public static void main(String[] args) {
        log.warn("from main");
        ConfigurableApplicationContext context = SpringApplication.run(ServerMain.class, args);

    }

    @Override
    public void run(String... strings) throws Exception {
        log.info("starting run");
        db.initDBTables();
        tasks.start();
    }