2015-01-06 5 views
1

Я смущен о том, как работает 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"); 

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

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

<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' 
 

Примечание: Я также видящие это весной журналы загрузки 2 раза:

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

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

+0

Обычно вы увидите 2 контекста: сервлет и корень. Тем не менее, я бы с подозрением относился к тому, что еще может быть в файле конфигурации XML «Spring Boot» и о том, как он загружается. Существование такого файла может указывать на то, что это не приложение Spring Boot. Если это приложение Spring Boot, и это файл конфигурации Spring XML, то вы, вероятно, загрузите два контекста (сервлет и root) на основе этого файла, а Spring Boot также загрузит сервлет и корневой контекст. – Steve

+1

Как правило, ваш xml игнорируется при использовании Spring Boot, и вы должны просто использовать '@ PropertySource' для загрузки дополнительных файлов свойств. Однако самым простым решением является просто добавить ваши свойства к загружаемому по умолчанию файлу 'application.properties'. –

+0

@Steve - О, это определенно приложение Spring Boot. Фактически, вы можете сказать, что это пример того, как перенести устаревшее приложение из JBoss EAP & Spring в Spring Boot (без встроенных JMS, JNDI, JTA и JCA). Моему приложению 10 лет, ~ 500 тыс. Строк и более 250 весенних фасоли в XML, без необходимости перегруппировать их все на Java. Нет веб-или диспетчерских XML. Но старые бобы, основанные на XML, загружаются в Spring Boot с помощью ImportResource в аннотированном классе конфигурации. Они загружаются просто отлично! Именно эта одна деталь Среда меня смутила. Это единственная вещь, которая не загружается штрафом. – Jason

ответ

0

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

0

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

Это, как я решил мою проблему свойств окружающей среды:

С $ {} ctms.env существу окружающая среда мы выполняющиеся в, а также отражение в активном профиле Spring (например, Dev, тест, stage, prod), я использовал функцию Spring Boot для автоматической загрузки файлов свойств профиля «по соглашению» для меня.

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

За Спринг активный профиль = «Foo», он будет автоматически загрузить этот файл, если он существует:

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

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

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

это в основном заканчивает тем, что-то вроде: для «Dev» Спринг активный профиль:

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

Для "тест" Весна активного профиля:

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

для "стадии" Весна активного профиля:

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

т.д.

Я Бесполезный не нужно повторять -write любые файлы свойств. Мне просто пришлось перекомпоновать их так, как «соглашения» Spring Boot «хотят найти/загрузить их. И, конечно же, прекратите загрузку через XML-способ. И он отлично работает.

Смежные вопросы