Я смущен о том, как работает 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?
Обычно вы увидите 2 контекста: сервлет и корень. Тем не менее, я бы с подозрением относился к тому, что еще может быть в файле конфигурации XML «Spring Boot» и о том, как он загружается. Существование такого файла может указывать на то, что это не приложение Spring Boot. Если это приложение Spring Boot, и это файл конфигурации Spring XML, то вы, вероятно, загрузите два контекста (сервлет и root) на основе этого файла, а Spring Boot также загрузит сервлет и корневой контекст. – Steve
Как правило, ваш xml игнорируется при использовании Spring Boot, и вы должны просто использовать '@ PropertySource' для загрузки дополнительных файлов свойств. Однако самым простым решением является просто добавить ваши свойства к загружаемому по умолчанию файлу 'application.properties'. –
@Steve - О, это определенно приложение Spring Boot. Фактически, вы можете сказать, что это пример того, как перенести устаревшее приложение из JBoss EAP & Spring в Spring Boot (без встроенных JMS, JNDI, JTA и JCA). Моему приложению 10 лет, ~ 500 тыс. Строк и более 250 весенних фасоли в XML, без необходимости перегруппировать их все на Java. Нет веб-или диспетчерских XML. Но старые бобы, основанные на XML, загружаются в Spring Boot с помощью ImportResource в аннотированном классе конфигурации. Они загружаются просто отлично! Именно эта одна деталь Среда меня смутила. Это единственная вещь, которая не загружается штрафом. – Jason