Spring PropertySourcesPlaceholderConfigurer в библиотеке
Фон : я пишу библиотеку, которая будет скомпилирована в файл JAR. Эта библиотека будет использоваться как зависимость в ряде веб-приложений. И библиотека, и веб-приложения используют Spring. В веб-приложении есть обязанность запустить ComponentScan на библиотечных классах, чтобы подобрать любые Spring Beans / configuration.
Ask : в библиотеке я хочу загрузить свойства из файла свойств с помощью PropertySourcesPlaceholderConfigurer. Что-то вот так:
package com.blah;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
@Configuration
@PropertySource("classpath:properties/blah.${environment}.properties")
public class AppConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Это работает нормально.
Вопрос : Если веб-приложение, которое загружает эту библиотеку как зависимость, также использует PropertySourcesPlaceholderConfigurer для загрузки свойств, возникнет ли конфликт между ними? Будет ли одно переопределять другое (даже если свойства различны)? Или они могут жить в мирной гармонии бок о бок?
Использование Пружины 3.2.4
Обновление
Согласно приведенному ниже ответу Богдана Ороса, похоже, что это нормально. они не будут конфликтовать, и оба набора свойств будут загружены. Я создал два файла конфигурации:
@Configuration
@PropertySource("classpath:properties/blah.stage1.properties")
public class BlahClientConfig1 {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
И
@Configuration
@PropertySource("classpath:properties/blah.stage2.properties")
public class BlahClientConfig2 {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Когда я выполняю свои тесты, я могу успешно извлекать значения свойств из обоих бла.Стадия 1.недвижимость и прочее.stage2.свойства
1 ответ:
Вы можете провести эксперимент: создать один и тот же Боб в двух разных конфигурациях в одном и том же classpath, и он будет работать
Это будет работать правильно, потому что весна разрешает такие ситуации. Вы обнаружите, что один боб заменен другим. Но если вы поможете spring и setup имена явно@Configuration class AConfiguration { @Bean public static PropertySourcesPlaceholderConfigurer resolver() { return new PropertySourcesPlaceholderConfigurer(); } } @Configuration class B {| @Bean public static PropertySourcesPlaceholderConfigurer resolver() { return new PropertySourcesPlaceholderConfigurer(); } }@Configuration class A { @Bean(name="resolver") public static PropertySourcesPlaceholderConfigurer resolver() { return new PropertySourcesPlaceholderConfigurer(); } } @Configuration class B { @Bean(name="resolver") public static PropertySourcesPlaceholderConfigurer resolver() { return new PropertySourcesPlaceholderConfigurer(); } }Эта ситуация вызовет сбой инъекции, потому что он не может решить, какой Боб вводить. это объясняется здесь , а также его можно настроить с помощью
DefaultListableBeanFactory. Проверьте этот ответ.
Comments