Рубрики
Без рубрики

Программная настройка источника данных при весенней загрузке

Узнайте, как программно настроить источник данных Spring Boot, тем самым обходя алгоритм автоматической настройки источника данных Spring Boot.

Автор оригинала: Alejandro Ugarte.

1. Обзор

Spring Boot использует самоуверенный алгоритм для поиска и настройки источника данных . Это позволяет нам легко получить полностью настроенную реализацию DataSource по умолчанию.

Кроме того, Spring Boot автоматически настраивает молниеносный пул соединений — либо HikariCP , Apache Tomcat или Commons DBCP , в таком порядке , в зависимости от того, какие из них находятся на пути к классу.

В то время как автоматическая DataSource конфигурация Spring Boot работает очень хорошо в большинстве случаев, иногда нам понадобится более высокий уровень управления , поэтому нам придется настроить нашу собственную DataSource реализацию, следовательно, пропустив процесс автоматической настройки.

В этом уроке мы узнаем , как программно настроить источник данных в Spring Boot .

Дальнейшее чтение:

Spring JPA – Несколько баз данных

Настройка отдельного источника данных Spring для тестов

2. Зависимости Maven

Создание источника данных реализация программно проста, в целом .

Чтобы узнать, как это сделать, мы реализуем простой слой репозитория, который будет выполнять операции CRUD с некоторыми объектами JPA.

Давайте взглянем на зависимости нашего демонстрационного проекта:


    org.springframework.boot
    spring-boot-starter-data-jpa


    com.h2database
    h2
    2.4.1 
    runtime 

Как показано выше, мы будем использовать экземпляр базы данных H2 в памяти для реализации уровня репозитория. При этом мы сможем протестировать программно настроенный источник данных, без затрат на выполнение дорогостоящих операций с базой данных.

Кроме того, давайте обязательно проверим последнюю версию spring-boot-starter-data-jpa на Maven Central.

3. Программная настройка источника данных

Теперь, если мы будем придерживаться автоматической конфигурации источника данных Spring Boot и запустим наш проект в его текущем состоянии, он будет работать так, как ожидалось.

Spring Boot сделает за нас всю тяжелую инфраструктуру. Это включает в себя создание реализации H2 DataSource , которая будет автоматически обрабатываться HikariCP, Apache Tomcat или Commons DBCP, а также настройку экземпляра базы данных в памяти.

Кроме того, нам даже не нужно создавать файл application.properties , так как Spring Boot также предоставит некоторые настройки базы данных по умолчанию.

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

Самый простой способ сделать это-определить метод DataSource factory и поместить его в класс с аннотацией @Configuration annotation :

@Configuration
public class DataSourceConfig {
    
    @Bean
    public DataSource getDataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url("jdbc:h2:mem:test");
        dataSourceBuilder.username("SA");
        dataSourceBuilder.password("");
        return dataSourceBuilder.build();
    }
}

В этом случае мы использовали удобный DataSourceBuilder класс — не беглую версию шаблона конструктора Джошуа Блохадля программного создания нашего пользовательского источника данных объекта .

Этот подход действительно хорош, потому что конструктор позволяет легко настроить источник данных , используя некоторые общие свойства. Кроме того, он также использует базовый пул соединений.

4. Экстернализация конфигурации источника данных с помощью файла application.properties

Конечно, также возможно частично экстернализировать нашу конфигурацию Источника данных . Например, мы могли бы определить некоторые основные свойства источника данных в нашем заводском методе:

@Bean 
public DataSource getDataSource() { 
    DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create(); 
    dataSourceBuilder.username("SA"); 
    dataSourceBuilder.password(""); 
    return dataSourceBuilder.build(); 
}

И укажите несколько дополнительных в файле application.properties :

spring.datasource.url=jdbc:h2:mem:test
spring.datasource.driver-class-name=org.h2.Driver

Свойства, определенные во внешнем источнике, такие как Свойства, определенные во внешнем источнике, такие как файл или через класс, аннотированный @ConfigurationProperties , переопределит те, которые определены в Java API.

Становится очевидным, что при таком подходе мы больше не будем хранить наши Источник данных Параметры конфигурации в одном месте .

С другой стороны, это позволяет нам держать параметры конфигурации времени компиляции и среды выполнения четко отделенными друг от друга.

Это действительно хорошо, так как позволяет нам легко установить точку привязки конфигурации. Таким образом, мы можем включить различные Источник данных настройки из других источников, без необходимости рефакторинга методов фабрики бобов.

5. Тестирование конфигурации источника данных

Тестирование нашей пользовательской конфигурации DataSource очень просто. Весь процесс сводится к созданию сущности JPA , определению базового интерфейса репозитория и тестированию уровня репозитория.

5.1. Создание сущности JPA

Давайте начнем определять наш пример класса сущностей JPA, который будет моделировать пользователей:

@Entity
@Table(name = "users")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    private String email;

    // standard constructors / setters / getters / toString
    
}

5.2. Простой слой Репозитория

Затем нам нужно реализовать базовый уровень репозитория, который позволяет нам выполнять операции CRUD с экземплярами класса User entity, определенного выше.

Поскольку мы используем Spring Data JPA , нам не нужно создавать нашу собственную реализацию DAO с нуля. Нам просто нужно расширить интерфейс CrudRepository , чтобы получить рабочую реализацию репозитория:

@Repository
public interface UserRepository extends CrudRepository {}

5.3. Тестирование уровня репозитория

Наконец, нам нужно проверить, что программно настроенный Источник данных действительно работает. Мы можем легко сделать это с помощью интеграционного теста:

@RunWith(SpringRunner.class)
@DataJpaTest
public class UserRepositoryIntegrationTest {
    
    @Autowired
    private UserRepository userRepository;
   
    @Test
    public void whenCalledSave_thenCorrectNumberOfUsers() {
        userRepository.save(new User("Bob", "[email protected]"));
        List users = (List) userRepository.findAll();
        
        assertThat(users.size()).isEqualTo(1);
    }    
}

Класс User Repository Integration Test довольно понятен. Он просто использует два метода CRUD интерфейса репозитория для сохранения и поиска сущностей.

Обратите внимание, что независимо от того, решим ли мы программно настроить вашу реализацию DataSource или разделить ее на метод конфигурации Java и файл application.properties , мы всегда должны получать рабочее соединение с базой данных .

5.4. Запуск примера приложения

Наконец, мы можем запустить наше демо-приложение, используя стандартный метод main() :

@SpringBootApplication
public class Application {

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

    @Bean
    public CommandLineRunner run(UserRepository userRepository) throws Exception {
        return (String[] args) -> {
            User user1 = new User("John", "[email protected]");
            User user2 = new User("Julie", "[email protected]");
            userRepository.save(user1);
            userRepository.save(user2);
            userRepository.findAll().forEach(user -> System.out.println(user);
        };
    }
}

Мы уже протестировали уровень репозитория, поэтому мы уверены, что наш Источник данных был успешно настроен. Таким образом, если мы запустим пример приложения, мы должны увидеть в нашей консоли вывод списка User сущностей, хранящихся в базе данных.

6. Заключение

В этом уроке мы узнали, как программно настроить источник данных реализацию в Spring Boot .

Как обычно, все примеры кода, показанные в этом руководстве, доступны на GitHub .