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>)
Читайте также:
- Spring IoC контейнер: конфигурация на основе аннотаций, @Resource
- Spring IoC контейнер: конфигурация на основе аннотаций, точная настройка автопривязки на основе аннотаций с @Primary
- Spring IoC контейнер: конфигурация на основе аннотаций, использование @Autowired
- Spring IoC контейнер: конфигурация на основе аннотаций, настройка автопривязки на основе аннотаций с @Qualifier
- Spring IoC контейнер: конфигурация на основе аннотаций, использование дженериков в качестве квалификаторов автопривязки
Комментарии
Отправить комментарий