Статьи

Использование @ConfigurationProperties в Spring Boot

Логотип-весна-ю

В своем последнем сообщении в блоге я кратко описал, как можно настроить почту в приложении 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 ? В определенных сценариях, вероятно, да, но это просто выбор, который вам нужно сделать.