Как Spring справляется с @Autowired в полях, требующих параметра? В этом случае JdbcTemplate с DataSource - PullRequest
0 голосов
/ 06 августа 2020

У меня есть приложение SpringBoot, которое я хочу подключить к своей базе данных MySQL, и я хочу подключить его с помощью JDB C (само по себе, без использования JPA). И из того, что я видел в статьях, один из способов добиться этого - использовать объекты JdbcTemplate и DataSource).

Теперь у меня есть RestController, где я называю свою базу данных "CoffeeShop", в которой есть меня со следующим классом / кодом:

@RestController
public class MenuController {
    
    
    @Autowired
    private DataSource dataSource;

    @Autowired
    private JdbcTemplate jdbcTemplate;

    private String menuQuery = "SELECT * FROM menu";

    @CrossOrigin(origins = "http://localhost:4200")
    @GetMapping(path="/menu")
    public String getMenu(){

        jdbcTemplate.query(menuQuery, (rs, rowNum) -> new Menu(rs.getString("name"))).forEach(
            customer-> System.out.println(customer.getName()));

        return  "worked";
    }

    private List<Menu> organizeMenu() {
        return null;
    }
}

Если я правильно понимаю, я ожидаю, что dataSource сможет увидеть в моем application.properties файле следующее содержимое при компиляции, а затем цифры Spring что jdbcTemplate требует этого?:

spring.jpa.hibernate.ddl-auto=none
spring.datasource.driverclassname = com.mysql.jdbc.Driver
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.datasource.url=jdbc:mysql://${MYSQL_HOST:localhost}:3306/CoffeeShop?useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=springuser
spring.datasource.password=ThePassword

К моему удивлению, это сработало, мой код запросил БД и записал правильный вывод. Но я не уверен, как это сработало, поскольку jdbcTemplate требуется dataSource?

1 Ответ

4 голосов
/ 06 августа 2020

См. Spring Boot Начало работы | Доступ к реляционным данным с помощью JDB C с помощью руководства Spring , в котором говорится:

Spring Boot поддерживает H2 (механизм реляционной базы данных в памяти) и автоматически создает соединение. Поскольку мы используем spring-jdbc, Spring Boot автоматически создает JdbcTemplate. Поле @Autowired JdbcTemplate автоматически загружает его и делает доступным.

Это то, что вы получаете с автоконфигурация, предоставляемая Spring Boot: Полнофункциональный JdbcTemplate автоматически создается и настраивается из файла application.properties.

К вашему сведению: JdbcTemplate уже настроен для использования DataSource, поэтому вам не нужно автоматически подключать DataSource. Как вы можете видеть в вашем собственном коде, поле dataSource нигде не используется, поэтому вам следует удалить его.

На самом деле это DataSource, который автоматически настраивается из файла application.properties .

...