Створення користувацького стартера з Spring Boot

1. Огляд

Основні розробники Spring Boot пропонують початкові роботи для більшості популярних проектів з відкритим кодом, але ми не обмежуємось ними.

Ми також можемо написати власні власні початкові статті . Якщо у нас є внутрішня бібліотека для використання в нашій організації, було б непоганою практикою також написати для неї початковий файл, якщо він буде використовуватися в контексті Spring Boot.

Ці стартери дозволяють розробникам уникати тривалої конфігурації та швидко починати їх розробку. Однак, коли багато речей відбувається у фоновому режимі, іноді стає важко зрозуміти, як анотація або просто включення залежності в pom.xml включає стільки функцій.

У цій статті ми демістифікуємо магію Spring Boot, щоб побачити, що відбувається за лаштунками. Потім ми будемо використовувати ці концепції для створення початкової статті для власної власної бібліотеки.

2. Демістифікація автоконфігурації Spring Boot

2.1. Класи автоматичної конфігурації

Коли запускається Spring Boot, він шукає файл із назвою spring.factories у шляху до класу. Цей файл знаходиться в каталозі META-INF . Давайте розглянемо фрагмент цього файлу з проекту spring-boot-autoconfigure:

# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

Цей файл відображає ім'я у різні класи конфігурації, які Spring Boot намагатиметься запустити. Отже, згідно з цим фрагментом, Spring Boot спробує запустити всі класи конфігурації для RabbitMQ, Cassandra, MongoDB та Hibernate.

Чи будуть ці класи дійсно виконуватися, залежатиме від наявності залежних класів на шляху до класу. Наприклад, якщо класи для MongoDB знайдені на шляху до класу , MongoAutoConfiguration буде запущено, і всі пов'язані з mongo компоненти будуть ініціалізовані.

Цю умовну ініціалізацію вмикає анотація @ConditionalOnClass . Давайте подивимось на фрагмент коду з класу MongoAutoConfiguration, щоб побачити його використання:

@Configuration @ConditionalOnClass(MongoClient.class) @EnableConfigurationProperties(MongoProperties.class) @ConditionalOnMissingBean(type = "org.springframework.data.mongodb.MongoDbFactory") public class MongoAutoConfiguration { // configuration code }

Тепер як - якщо MongoClient доступний у шляху до класу - цей клас конфігурації буде запускатись, заповнюючи фабрику Spring bean за допомогою MongoClient, ініціалізованого за замовчуванням.

2.2. Спеціальні властивості з файлу application.properties

Spring Boot ініціалізує компоненти, використовуючи деякі попередньо налаштовані за замовчуванням. Щоб замінити ці за замовчуванням, ми зазвичай оголошуємо їх у файлі application.properties з певним ім'ям. Ці властивості автоматично визначаються контейнером Spring Boot.

Подивимось, як це працює.

У фрагменті коди для MongoAutoConfiguration , @EnableConfigurationProperties анотація оголошена з MongoProperties класу , який виступає в якості контейнера для користувацьких властивостей:

@ConfigurationProperties(prefix = "spring.data.mongodb") public class MongoProperties { private String host; // other fields with standard getters and setters }

Префікс та назва поля роблять імена властивостей у файлі application.properties . Отже, щоб встановити хост для MongoDB, нам потрібно лише написати наступне у файлі властивостей:

spring.data.mongodb.host = localhost

Аналогічним чином, значення для інших полів класу можна встановити, використовуючи файл властивостей.

3. Створення користувацького стартера

Виходячи з концепцій у розділі 2, для створення власного стартера нам потрібно написати такі компоненти:

  1. Клас автоматичної конфігурації для нашої бібліотеки разом із класом властивостей для власної конфігурації.
  2. Початкова пам'ять про включення залежностей бібліотеки та проекту автоконфігурації.

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

3.1. Модуль автоконфігурації

Ми будемо називати наш модуль автоматичного налаштування greeter-spring-boot-autoconfigure . Цей модуль матиме два основних класи, тобто GreeterProperties, що дозволить встановлювати власні властивості через файл application.properties та GreeterAutoConfiguartion, який створюватиме компоненти для бібліотеки greeter .

Давайте розглянемо код обох класів:

@ConfigurationProperties(prefix = "baeldung.greeter") public class GreeterProperties { private String userName; private String morningMessage; private String afternoonMessage; private String eveningMessage; private String nightMessage; // standard getters and setters }
@Configuration @ConditionalOnClass(Greeter.class) @EnableConfigurationProperties(GreeterProperties.class) public class GreeterAutoConfiguration { @Autowired private GreeterProperties greeterProperties; @Bean @ConditionalOnMissingBean public GreetingConfig greeterConfig() { String userName = greeterProperties.getUserName() == null ? System.getProperty("user.name") : greeterProperties.getUserName(); // .. GreetingConfig greetingConfig = new GreetingConfig(); greetingConfig.put(USER_NAME, userName); // ... return greetingConfig; } @Bean @ConditionalOnMissingBean public Greeter greeter(GreetingConfig greetingConfig) { return new Greeter(greetingConfig); } }

Нам також потрібно додати файл spring.factories в каталог src / main / resources / META-INF із таким вмістом:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.baeldung.greeter.autoconfigure.GreeterAutoConfiguration

При запуску програми клас GreeterAutoConfiguration запускатиметься, якщо клас Greeter присутній у шляху до класу . Якщо його успішно запустити, він заповнить контекст програми Spring за допомогою GreeterConfig та Greeter , читаючи властивості за допомогою класу GreeterProperties .

@ConditionalOnMissingBean анотації гарантуватимуть , що ці боби будуть створені тільки якщо вони вже не існують. Це дозволяє розробникам повністю перевизначити автоматично налаштовані компоненти, визначаючи їх власні в одному з класів @Configuration .

3.2. Створення pom.xml

Тепер давайте створимо початковий пом, який додасть залежності для модуля автоматичного налаштування та бібліотеки привітання.

Відповідно до угоди про іменування, усі початкові роботи, якими не керує основна команда Spring Boot, повинні починатися з імені бібліотеки, за якою слід суфікс -spring-boot-starter . Тож ми будемо називати наш стартер як greeter-spring-boot-starter:

 4.0.0 com.baeldung greeter-spring-boot-starter 0.0.1-SNAPSHOT  UTF-8 0.0.1-SNAPSHOT 2.2.6.RELEASE    org.springframework.boot spring-boot-starter ${spring-boot.version}   com.baeldung greeter-spring-boot-autoconfigure ${project.version}   com.baeldung greeter ${greeter.version}   

3.3. Використання стартера

Давайте створимо додаток greeter-spring-boot-sample-app, який буде використовувати стартер. У pom.xml нам потрібно додати його як залежність:

 com.baeldung greeter-spring-boot-starter ${greeter-starter.version} 

Spring Boot автоматично налаштує все, і ми отримаємо зелений біб, готовий до введення та використання.

Давайте також змінимо деякі значення за замовчуванням GreeterProperties , визначивши їх у файлі application.properties із префіксом baeldung.greeter :

baeldung.greeter.userName=Baeldung baeldung.greeter.afternoonMessage=Woha\ Afternoon

Нарешті, давайте використаємо у нашому застосуванні зелений біб:

@SpringBootApplication public class GreeterSampleApplication implements CommandLineRunner { @Autowired private Greeter greeter; public static void main(String[] args) { SpringApplication.run(GreeterSampleApplication.class, args); } @Override public void run(String... args) throws Exception { String message = greeter.greet(); System.out.println(message); } }

4. Висновок

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

Повний вихідний код для всіх модулів, які ми створили в цій статті, можна знайти на GitHub.