Spring Util: Вложения свойств через аннотации в bean
Если у меня есть 2 файла .properties в моем XML Spring так:
<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/>
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/>
Как я могу вставить аннотации этих файлов свойств в bean с помощью java.util.Properties
?
Как я могу захватить определенные свойства с помощью аннотаций Spring?
Ура!
Ответы
Ответ 1
@Autowired
@Qualifier("serverProperties")
private Properties serverProperties;
@Autowired
@Qualifier("someConfig")
private Properties otherProperties;
или
@Resource(name = "serverProperties")
private Properties serverProperties;
@Resource(name = "someConfig")
private Properties otherProperties;
Как правило, @Autowired используется для автопотока by-type в Spring, а @Resource используется для по-имени. @Autowired + @Qualifier может удвоиться как автозапуск по имени, но это действительно предназначено для автопомощи по типу с возможностью тонкой настройки типа.
Ответ 2
Поскольку у этого вопроса много хитов. Я подумал, что было бы полезно указать другой вариант с использованием SpEL (Spring Expression Language) - если вам нужны конкретные свойства, которые они могут быть введены с помощью аннотации @Value для определенных свойств bean;
class SomeClass {
@Value("#{serverProperties['com.svr.prop']}")
private String aServerCfgProperty;
@Value("#{someConfig['another.config.setting']}")
private String someOtherProperty;
}
Вам не нужно использовать синтаксис индексации ['index.val']
, вы можете просто получить его напрямую;
@Value("#{someConfig}")
private Properties someConfig
@Value("#{serverProperties}")
private Properties svrProps;
Я нашел это довольно полезным и ушел от использования объекта свойств, непосредственно вложенного через @Resource/@Autowired.
Еще одна приятная причина использования @Value
с индексированным объектом Properties заключается в том, что некоторые IDE (например, IntelliJ) могут реорганизовать фактические имена свойств, если у вас также есть файл .properties в проекте. Еще один совет - использовать что-то вроде EProperties (который расширяет собственный объект свойств Java), если вы хотите сделать включение/вложенность/замещение в свойствах файлы без использования класса Spring PropertiesPlaceholderConfigurer
(который, к сожалению, не раскрывает его свойств), для использования индексации spel ['key']
bean должен быть экземпляром Map<>
, т.е. расширять карту, которую выполняет объект Java Properties)..
Наконец, еще одна опрятная функция SpEL - вы можете напрямую получить доступ к свойствам beans. Так скажем, например, если SomeClass
в приведенном выше примере был Spring bean например. SomeClass
, то в AnotherBeanClass мы могли бы иметь;
@Value("#{someClass.someOtherProperty}")
private String injectedBeanProp
Вы также можете вызвать метод getter:
@Value("#{someClass.getSomeOtherProperty()}")
private String injectedBeanProp
См. руководство по SpEL здесь; http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions
Ответ 3
Вы можете использовать @PropertySource
@Configuration
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"})
public class MyConfiguration {
}
Ответ 4
Файл XMl
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<context:component-scan base-package="com.sha.home" />
<mvc:annotation-driven/>
<util:properties id="dbProp" location="classpath:db.properties" />
<!-- <context:property-placeholder location="classpath:db.properties"/> -->
</beans>
в java файле
@value ( "# {dbProp}" ) частные свойства dbProperties;
System.out.println( "urllll" + dbProperties.getProperty( "jdbc.url" ));
Ответ 5
В большинстве случаев я инкапсулирую все свойства в одну утилиту и использую ее в своих приложениях. Таким образом, вам не нужно беспокоиться/управлять каждым файлом свойств на уровне приложения. Autowired setProps (...) читает все загруженные util: properties в список реквизитов.
import java.util.List;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class AppProperiesProcessor {
private List<Properties> props;
private Properties mergedProperties;
@Autowired
public final void setProps(List<Properties> props) {
this.props = props;
}
public String getProp(final String keyVal) {
if (null == this.mergedProperties) {
this.mergedProperties = new Properties();
for (Properties prop : this.props) {
this.mergedProperties.putAll(prop);
}
}
return mergedProperties.getProperty(keyVal);
}
}