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.свойства

469   1  

1 ответ:

Вы можете провести эксперимент: создать один и тот же Боб в двух разных конфигурациях в одном и том же classpath, и он будет работать

@Configuration
class AConfiguration {
    @Bean
    public static PropertySourcesPlaceholderConfigurer resolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

@Configuration
class B {|
    @Bean
    public static PropertySourcesPlaceholderConfigurer resolver() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}
Это будет работать правильно, потому что весна разрешает такие ситуации. Вы обнаружите, что один боб заменен другим. Но если вы поможете spring и setup имена явно
@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

    Ничего не найдено.