Spring Environment - несколько?

Я не понимаю, как работает Spring Environment. Я думал, что это в основном синглтон в ApplicationContext и в любое время я загружаю PropertySources в мой AppCtx, они объединяются в этот сингл Environment автоматически. Тем не менее, я вижу это записано много раз в моем приложении, что означает конструктор AbstractEnvironment вызывается много раз:


2015-01-06 12:16:26,858 DEBUG (main) [org.springframework.core.env.StandardEnvironment] Adding [systemProperties] PropertySource with lowest search precedence
2015-01-06 12:16:26,858 DEBUG (main) [org.springframework.core.env.StandardEnvironment] Adding [systemEnvironment] PropertySource with lowest search precedence
2015-01-06 12:16:26,858 DEBUG (main) [org.springframework.core.env.StandardEnvironment] Initialized StandardEnvironment with PropertySources [systemProperties,systemEnvironment]

В результате я делаю такие вещи, как:

@Autowire
Environment environment;

String propertyIExpect = environment.getProperty("myprop");

И я получаю экземпляр Environment, но никаких свойств, которые я ожидал присутствовать, в нем нет.

Я ожидал, что они были добавлены к этой автоматической проводной Environment когда я добавил этот XML в контекст приложения Spring Boot:

<context:property-placeholder location="classpath:/spring/environment/${ctms.env}/application.properties" order="1"/>
<context:property-placeholder location="classpath:build.info" order="2"/>

Опять же, иногда Environment свойства там, как показано в этом журнале:


2015-01-06 12:16:37,433 TRACE (main) [org.springframework.core.env.PropertySourcesPropertyResolver] getProperty("ctms.env", String)
2015-01-06 12:16:37,433 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'ctms.env' in [servletConfigInitParams]
2015-01-06 12:16:37,433 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'ctms.env' in [servletContextInitParams]
2015-01-06 12:16:37,433 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'ctms.env' in [systemProperties]
2015-01-06 12:16:37,433 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Found key 'ctms.env' in [systemProperties] with type [String] and value 'dev'
2015-01-06 12:16:37,438 DEBUG (main) [org.springframework.core.env.MutablePropertySources] Adding [environmentProperties] PropertySource with lowest search precedence
2015-01-06 12:16:37,438 INFO  (main) [org.springframework.context.support.PropertySourcesPlaceholderConfigurer] Loading properties file from class path resource [spring/environment/dev/application.properties]
2015-01-06 12:16:37,438 DEBUG (main) [org.springframework.core.env.MutablePropertySources] Adding [localProperties] PropertySource with lowest search precedence
2015-01-06 12:16:37,443 TRACE (main) [org.springframework.core.env.PropertySourcesPropertyResolver] getProperty("database.connection.url", String)
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [environmentProperties]
2015-01-06 12:16:37,443 TRACE (main) [org.springframework.core.env.PropertySourcesPropertyResolver] getProperty("database.connection.url", String)
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [servletConfigInitParams]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [servletContextInitParams]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [systemProperties]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [systemEnvironment]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [random]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [applicationConfig: [classpath:/application.properties]]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Could not find key 'database.connection.url' in any property source. Returning [null]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Searching for key 'database.connection.url' in [localProperties]
2015-01-06 12:16:37,443 DEBUG (main) [org.springframework.core.env.PropertySourcesPropertyResolver] Found key 'database.connection.url' in [localProperties] with type [String] and value 'jdbc:oracle:thin:@somehost:someport/foo'

ПРИМЕЧАНИЕ: я также вижу это в журналах Spring Boot 2 раза:

12:19:03,387 INFO  [TomcatEmbeddedServletContainer] Tomcat started on port(s): 8080/http

Я бы ожидал этого один раз в конце. Возможно, это связано? Я как-то создаю несколько ApplicationContextв моем приложении Spring Boot?

2 ответа

XML <context:property-placeholder/> не добавляется в Environment, Журналы DEBUG - просто шум, поэтому, вероятно, игнорируются. Если вам это нужно в Environment затем используйте API-интерфейсы Spring Boot для установки местоположения свойств (или, возможно, нас @PropertySource).

Исходя из рекомендаций, размещенных здесь, я больше не загружаю файл свойств: classpath: / spring / ${ctms.env} /application.properties из <context:property-placeholder> XML.

Вот как я решил проблему со свойствами среды:

Поскольку ${ctms.env} по сути является средой, в которой мы работаем, а также отражается в активном профиле Spring (например, dev, test, stage, prod), я в итоге использовал функцию Spring Boot для автоматической загрузки файлов свойств активного профиля. "по договоренности" для меня.

Чтобы уточнить, эта функция Spring Boot будет искать файлы.properties в определенных местах на основе активных профилей. Как это:

Для Spring Active Profile = "foo" он автоматически загрузит этот файл, если он существует:

WEB-INF/classes/config/application-foo.properties

Для моего решения я переименую и переименую файл свойств в моей WAR Boot Spring так:

/WEB-INF/classes/config/application-${ctms-env}.properties

В основном это выглядит примерно так: Для "dev" Spring Active Profile:

/WEB-INF/classes/config/application-dev.properties

Для "теста" Spring Active Profile:

/WEB-INF/classes/config/application-test.properties

Для "этапа" Spring Active Profile:

/WEB-INF/classes/config/application-stage.properties

и т.п.

Мне не нужно было переписывать файлы свойств. Я просто должен был упаковать их так, как "условные обозначения" Spring Boot хотят найти / загрузить. И, конечно же, прекратить загрузку через XML. И это прекрасно работает.

Другие вопросы по тегам