2011-08-28 4 views
29

Если у меня есть 2 .properties установка файлов в моем Spring XML, как так:Spring Util: Свойства системы впрыск с помощью аннотаций в боб

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/> 
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/> 

Как можно вводить с помощью аннотаций этих свойств файлов в боб с java.util.Properties?

Как я могу захватить определенные свойства с помощью аннотаций Spring?

Cheers!

ответ

44
@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 используются для побочного типа автоматического связывания весны и @Resource используется для имени-по. @ Autowired + @ Qualifier может удвоиться как авторизованное имя по имени, но оно действительно предназначено для автопотока by-type с возможностью fine-tune the type.

+0

Спасибо за примеры информации и кода! Работы – NightWolf

2

Вы можете использовать @PropertySource

@Configuration 
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"}) 
public class MyConfiguration { 
} 
+0

Это хорошо, это устраняет необходимость в конфигурации XML в целом. – bluecollarcoder

15

Поскольку этот вопрос имеет много хитов. Я подумал, что было бы полезно указать другой вариант, используя SpEL (Spring Expression Language) - если вам нужны конкретные свойства, которые они могут быть введены с использованием аннотации @Value для конкретных свойств компонента;

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 с индексированным объектом «Свойства» заключается в том, что некоторые IDE (например, IntelliJ) могут реорганизовывать имена реальных объектов, если у вас также есть файл .properties в проекте. Еще один совет: использовать что-то вроде EProperties (которое расширяет собственный объект свойств Java), если вы хотите сделать включение/вложенность/подстановку в файлах свойств без использования класса Spring PropertiesPlaceholderConfigurer (который, к сожалению, не раскрывает его свойств), чтобы использовать индексацию Spel ['key'] bean должен быть экземпляр Map<>, т. е. расширить карту, которую выполняет объект Java Properties).

Наконец, еще одна опрятная функция SpEL - вы можете напрямую получить доступ к свойствам фасоли. Так скажем, например, если SomeClass в приведенном выше примере был весенним бобом, например. someClass, тогда в AnotherBeanClass мы могли бы иметь;

@Value("#{someClass.someOtherProperty}") 
private String injectedBeanProp 

Вы также можете вызвать метод геттер:

@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

+1

Просто примечание SpEL весной 3+ – NightWolf

+0

Подробнее здесь; http://blog.nemccarthy.me/?p=304 – NightWolf

+0

Я просто получаю нулевые значения для аннотаций @Value !!! –

0

Большая часть времени я инкапсулирую все свойства в одну утилиту и использую ее в своих приложениях. Таким образом, вам не нужно беспокоиться/управлять каждым файлом свойств на уровне приложения. Autowired setProps (...) читает все, что вы загрузили : свойства на реквизиты.

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); 
    } 
} 
1

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"));

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