В своем последнем сообщении в блоге я кратко описал, как можно настроить почту в приложении Spring Boot . Чтобы добавить свойства в конфигурацию, я использовал аннотацию Spring @Value
. Но Spring Boot предоставляет альтернативный метод работы со свойствами, который позволяет строго типизированным bean-компонентам управлять и проверять конфигурацию вашего приложения. В этом посте я @ConfigurationProperties
как использовать @ConfigurationProperties
при настройке приложения.
Поэтому мы хотим использовать конфигурацию почты в качестве примера. Файл конфигурации находится в отдельном файле, который называется mail.properties
. Свойства должны быть названы с использованием правильного соглашения, чтобы их можно было правильно связать. Давайте посмотрим несколько примеров:
-
protocol
иPROTOCOL
будут привязаны к полюprotocol
боба -
smtp-auth
,smtp_auth
,smtpAuth
будет привязан к полюsmtpAuth
бина -
smtp.auth
будет привязан к … хм кsmtp.auth
полю бобов!
Spring Boot использует некоторые @ConfigurationProperties
правила для привязки свойств к @ConfigurationProperties
компонентам @ConfigurationProperties
и поддерживает иерархическую структуру.
Итак, давайте создадим компонент @ConfigurationProperties
:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
@ConfigurationProperties (locations = "classpath:mail.properties" , ignoreUnknownFields = false , prefix = "mail" ) public class MailProperties { public static class Smtp { private boolean auth; private boolean starttlsEnable; // ... getters and setters } @NotBlank private String host; private int port; private String from; private String username; private String password; @NotNull private Smtp smtp; // ... getters and setters } |
… Это должно быть создано из следующих свойств ( mail.properties
):
1
2
3
4
5
6
7
|
mail.host=localhost mail.port= 25 mail.smtp.auth= false mail.smtp.starttls-enable= false mail.from=me @localhost mail.username= mail.password= |
В приведенном выше примере мы аннотировали компонент с помощью @ConfigurationProperties
чтобы Spring Boot мог привязать к нему свойства. ignoreUnknownFields = false
указывает Spring Boot ignoreUnknownFields = false
исключение, когда существуют свойства, которые не соответствуют объявленному полю в компоненте. Это очень удобно при разработке! prefix
позволяет выбрать префикс имени свойств для привязки.
Обратите внимание, что сеттеры и геттеры должны создаваться в @ConfigurationProperties
компоненте @ConfigurationProperties
! И в противоположность аннотации @Value
это может принести некоторый дополнительный шум в код (особенно в простых случаях, на мой взгляд).
Хорошо, но мы хотим использовать свойства для настройки нашего приложения. Существует как минимум два способа создания @ConfigurationProperties
. Мы можем использовать его вместе с @Configuration
который предоставляет @Bean
s, или мы можем использовать его отдельно и внедрить в @Configuration
компонент @Configuration
.
Первый сценарий:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
@Configuration @ConfigurationProperties (locations = "classpath:mail.properties" , prefix = "mail" ) public class MailConfiguration { public static class Smtp { private boolean auth; private boolean starttlsEnable; // ... getters and setters } @NotBlank private String host; private int port; private String from; private String username; private String password; @NotNull private Smtp smtp; // ... getters and setters @Bean public JavaMailSender javaMailSender() { // omitted for readability } } |
Во втором сценарии мы просто аннотируем bean-компонент свойств (как указано выше) и используем @Autowire
из @Autowire
для внедрения его в bean-компонент конфигурации почты:
01
02
03
04
05
06
07
08
09
10
11
12
|
@Configuration @EnableConfigurationProperties (MailProperties. class ) public class MailConfiguration { @Autowired private MailProperties mailProperties; @Bean public JavaMailSender javaMailSender() { // omitted for readability } } |
Обратите внимание на аннотацию @EnableConfigurationProperties
. Эта аннотация говорит Spring Boot включить поддержку @ConfigurationProperties
указанного типа. Если не указано, иначе вы можете увидеть следующее исключение:
1
|
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [demo.mail.MailProperties] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: { @org .springframework.beans.factory.annotation.Autowired(required= true )} |
Просто примечание: есть другой способ (всегда есть другой способ с Spring Boot!), Чтобы сделать @ConfigurationProperties
аннотированных bean-компонентов @ConfigurationProperties
— просто добавьте аннотацию @Configuration
или @Component
к @Component
, чтобы ее можно было обнаружить во время сканирования компонента ,
Подводя итог, можно @ConfigurationProperties
, что @ConfigurationProperties
очень удобны. Это лучше, чем использование аннотации @Value
? В определенных сценариях, вероятно, да, но это просто выбор, который вам нужно сделать.
- Ознакомьтесь с документацией Spring Boot, чтобы узнать больше о типах безопасных свойств конфигурации: http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-external-config-typesafe-configuration- свойства
Ссылка: | Использование @ConfigurationProperties в Spring Boot от нашего партнера по JCG Рафаля Боровца в блоге Codeleak.pl . |