Spring IoC контейнер: конфигурация на основе аннотаций, @Value

@Value обычно используется для внедрения внешних свойств:

Java

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("${catalog.name}") String catalog) {
        this.catalog = catalog;
    }
}

Kotlin

@Component
class MovieRecommender(@Value("\${catalog.name}") private val catalog: String)

Со следующей конфигурацией:

Java

@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig { }

Kotlin

@Configuration
@PropertySource("classpath:application.properties")
class AppConfig

И следующий файл application.properties:

catalog.name=MovieCatalog

В этом случае параметр и поле каталога будут равны значению MovieCatalog.

Spring предоставляет встроенный преобразователь значений снисхождения. Он будет пытаться разрешить значение свойства, и, если оно не может быть разрешено, имя свойства (например, ${catalog.name}) будет введено в качестве значения. Если вы хотите сохранить строгий контроль над несуществующими значениями, вы должны объявить bean-компонент PropertySourcesPlaceholderConfigurer, как показано в следующем примере:

Java

@Configuration
public class AppConfig {

     @Bean
     public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
           return new PropertySourcesPlaceholderConfigurer();
     }
}

Kotlin

@Configuration
class AppConfig {

    @Bean
    fun propertyPlaceholderConfigurer() = PropertySourcesPlaceholderConfigurer()
}

При настройке PropertySourcesPlaceholderConfigurer с использованием JavaConfig метод @Bean должен быть статическим.

Использование описанной выше конфигурации гарантирует сбой инициализации Spring, если какой-либо заполнитель ${} не может быть разрешен. Также можно использовать такие методы, как setPlaceholderPrefix, setPlaceholderSuffix или setValueSeparator для настройки заполнителей.

Spring Boot по умолчанию настраивает bean-компонент PropertySourcesPlaceholderConfigurer, который будет получать свойства из файлов application.properties и application.yml.

Поддержка встроенного конвертера, предоставляемая Spring, позволяет автоматически обрабатывать простые преобразования типов (например, в Integer или int). Несколько значений, разделенных запятыми, могут быть автоматически преобразованы в массив String без дополнительных усилий.

Можно указать значение по умолчанию следующим образом:

Java

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("${catalog.name:defaultCatalog}") String catalog) {
        this.catalog = catalog;
    }
}

Kotlin

@Component
class MovieRecommender(@Value("\${catalog.name:defaultCatalog}") private val catalog: String)

Spring BeanPostProcessor использует ConversionService за сценой для обработки процесса преобразования значения String в @Value в целевой тип. Если вы хотите обеспечить поддержку преобразования для своего собственного пользовательского типа, вы можете предоставить свой собственный экземпляр компонента ConversionService, как показано в следующем примере:

Java

@Configuration
public class AppConfig {

    @Bean
    public ConversionService conversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        conversionService.addConverter(new MyCustomConverter());
        return conversionService;
    }
}

Kotlin

@Configuration
class AppConfig {

    @Bean
    fun conversionService(): ConversionService {
            return DefaultFormattingConversionService().apply {
            addConverter(MyCustomConverter())
        }
    }
}

Когда @Value содержит выражение SpEL, значение будет динамически вычисляться во время выполнения, как показано в следующем примере:

Java

@Component
public class MovieRecommender {

    private final String catalog;

    public MovieRecommender(@Value("#{systemProperties['user.catalog'] + 'Catalog' }") String catalog) {
        this.catalog = catalog;
    }
}

Kotlin

@Component
class MovieRecommender(
    @Value("#{systemProperties['user.catalog'] + 'Catalog' }") private val catalog: String)

SpEL также позволяет использовать более сложные структуры данных:

Java

@Component
public class MovieRecommender {

    private final Map<String, Integer> countOfMoviesPerCatalog;

    public MovieRecommender(
            @Value("#{{'Thriller': 100, 'Comedy': 300}}") Map<String, Integer> countOfMoviesPerCatalog) {
        this.countOfMoviesPerCatalog = countOfMoviesPerCatalog;
    }
}

Kotlin

@Component
class MovieRecommender(
    @Value("#{{'Thriller': 100, 'Comedy': 300}}") private val countOfMoviesPerCatalog: Map<String, Int>)


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки