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. И это прекрасно работает.