В своем последнем сообщении в блоге я кратко описал, как можно настроить почту в приложении 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=localhostmail.port=25mail.smtp.auth=falsemail.smtp.starttls-enable=falsemail.from=me@localhostmail.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 . |
