2017-02-10 7 views
2

Есть ли лучший способ, чем вызов loadProperties() в каждом классе?Каков правильный способ загрузки application.properties в несколько классов?

public void loadProperties() { 
    InputStream inputStream; 
    prop = new Properties(); 
    String propFileName = "application.properties"; 

    inputStream = getClass().getClassLoader().getResourceAsStream(propFileName); 

    if (inputStream != null) { 
     try { 
      prop.load(inputStream); 
     } catch (IOException e) { 
      LOGGER.error("Error: ", e); 
     } 
    } 
} 

Я знаю, что Spring предоставляет эту функциональность с @value аннотаций, но это работает только, если вы отмечаете класс как @Service. Хотя это, похоже, не является правым способом

+0

Зачем вам нужно, чтобы загрузить его вручную? Также он работает для любого весеннего боба только для аннотированных боба только @ Service. –

ответ

1

Весна в пути: первый метод Существует также способ, который аннотируется в java-коде, чтобы использовать аннотацию @Value для загрузки значения файла конфигурации, отмеченного на классе @Component, @Service, @Controller, @Repository , например:

@Component("fileUpload") 
public class FileUploadUtil implements FileUpload { 

private String filePath; 
@Value("#{prop.filePath}") 
public void setFilePath(String filePath) { 
    System.out.println(filePath); 
    this.filePath = filePath; 
} 

bean.xml

<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
<property name="locations"> 
    <array> 
    <value>classpath:public.properties</value> 
    </array> 
</property> 
</bean> 

Второй метод: Используйте конфигурационный файл , например:

<context:property-placeholder location="classpath:conn.properties"/> 
<bean id="dataSource" class="${dataSource}"> 
<property name="driverClass" value="${driverClass}" /> 
<property name="jdbcUrl" value="${jdbcUrl}" /> 
<property name="user" value="${user}" /> 
<property name="password" value="${password}" /> 
</bean> 

Я думаю, что эти два метода являются самыми простыми. Второй метод не является гибким. Java в использовании свойств позволит код redundancy.But вы можете также извлечь этот метод.

0

Лучший способ действительно использовать аннотацию @Value.

Обратите внимание, что она работает с любым Спрингом управляемого компонента как @Component, @Service, @Controller, @Repository

0

В случае классов, которые не являются услугами, которые можно использовать прототип и область действия бобов инстанцирования их с помощью приложения контекст внутри вашей функции.

applicationContext.getBean("aScopedBean"); 

Они похожи на ваш обычный не-одиночный объект java с компонентами, которые вам нужны из контекста весны.

Если вы хотите, чтобы ваши свойства в карте можно впрыснуть Среды.

@Autowired 
private Environment env; 
... 
env.getProperty("a_property"); 

Если вы хотите вообще избегать @Autowire, вам необходимо реализовать функцию или класс Utility.