如何使用 Spring 引导正确设置 JDBC 控制器 class?

How to set up JDBC controller class properly with Spring Boot?

我对 Spring Boot(甚至 Spring)还很陌生。我想创建一个 Singleton class 来控制我的 jdbc 数据库。在(成功的测试)之后,我尝试将我的主要 class 和这个 DBHandler class 分开,当我尝试在我的 DBHandler class 中调用我的数据库对象的方法时,我得到一个 NullPointerException。
也许我需要在我的 DBHandler class 上做一些注释?这是在 Spring 引导中创建数据库处理程序 class 的正确方法吗?

主要class:

import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application implements CommandLineRunner {

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

    @Override
    public void run(String... strings) throws Exception {
        DBHandler db = DBHandler.getDBHandler();
        db.deleteTable();
        db.createTable();
    }
}

JDBC Handler Singleton class 我想填充函数来与我的数据库交互,我可以从其他 classes 调用。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

public class DBHandler {

    @Autowired
    JdbcTemplate database;

    private static DBHandler instance;

    private DBHandler() {
    }

    public static DBHandler getDBHandler() {
        if (instance == null) {
            synchronized (DBHandler.class) {
                if (instance == null) {
                    instance = new DBHandler();
                }
            }
        }
        return instance;
    }

    public void createTable() {
        database.execute("CREATE TABLE users(id SERIAL, accountName VARCHAR(255), validated VARCHAR(255), validationCode VARCHAR(255), updateDate DATETIME)");
    }

    public void deleteTable() {
        database.execute("DROP TABLE IF EXISTS users");
    }
}

当我有我的 Autowired 数据库和主要(应用程序)中的功能时一切正常class。

默认情况下 spring 创建单例 bean,所以将其留给 spring 应用程序上下文,用 @Component

注释 DBHandler

DBHandler

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;

@Component
public class DBHandler {

@Autowired
JdbcTemplate database;

public void createTable() {
    database.execute("CREATE TABLE users(id SERIAL, accountName VARCHAR(255), validated VARCHAR(255), validationCode VARCHAR(255), updateDate DATETIME)");
}

public void deleteTable() {
    database.execute("DROP TABLE IF EXISTS users");
    }
}

申请

@SpringBootApplication
public class Application implements CommandLineRunner {

@Autowired
private DBHandler dBHandler;

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

@Override
public void run(String... strings) throws Exception {
    db.deleteTable();
    db.createTable();
    }
 }