Какова наилучшая практика для чтения файлов свойств в Java EE?
У меня есть несколько веб-приложений Java EE, работающих внутри одного и того же сервера приложений, и я хотел экпортировать файлы свойств, которые находятся внутри баннеров, в новый каталог, чтобы сделать эти свойства видимыми.
Каков рекомендуемый способ загрузки этих файлов свойств?
Ответы
Ответ 1
Лично я использую класс java.util.Properties и использую метод load() для loadproperties.
InputStream inputStream = MyProperties.class.getClassLoader().getResourceAsStream("file.properties");
this.properties = new Properties();
this.properties.load(inputStream);
Затем я использую метод get() для чтения свойств в виде строк.
Ответ 2
Если вы используете Spring, приятно абстрагироваться от кода, в котором есть даже файл свойств, и использовать PropertyPlaceHolderConfigurer
. Это позволяет вытеснить свойства из определения BeanFactory
в стандартный файл свойств Java.
Пример (вырванный из документов spring):
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>classpath:com/foo/jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
Ответ 3
Если вы используете JBoss, вы можете создать файл службы свойств (с именем something-service.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server>
<server>
<mbean code="org.jboss.varia.property.SystemPropertiesService"
name="jboss:type=Service,name=MySystemProperties">
<attribute name="Properties">
property_a=value a
property_b=value b
</attribute>
</mbean>
</server>
Скопируйте это в свой каталог развертывания, и свойства будут доступны с помощью System.getProperty()
Ответ 4
Вы можете использовать механизм конфигурации Apache DeltaSpike, который является CDI.
В соответствии с documentation:
Существует несколько различных API и способов доступа к индивидуальному сконфигурированные значения, каждый из которых подходит для другой цели:
-
ConfigResolver
методы для простого программного доступа к значениям
-
TypedResolver
API для типизированных значений конфигурации и точного управления над разрешением
-
@ConfigProperty
для ввода настроенных значений в beans
@ConfigProperty
Этот API позволяет вводить значения свойств в ваш beans и может быть использован в несколько этапов:
1. Создайте файл свойств (должен находиться в пути к классам)
database.user = admin
database.password = 123456
2. Внедрить PropertyFileConfig
интерфейс
Итак, Apache DeltaSpike будет знать, как найти файл свойств:
public class MyCustomPropertyFileConfig implements PropertyFileConfig {
@Override
public String getPropertyFileName() {
return "myconfig.properties";
}
@Override
public boolean isOptional() {
return false;
}
}
3. Внесите значения
Используйте @Inject
и @ConfigProperty
для ввода значений в beans:
@ApplicationScoped
public class MyBean {
@Inject
@ConfigProperty(name = "database.user")
private String user;
@Inject
@ConfigProperty(name = "database.password")
private String password;
// Getters and setter ommitted
}
Подробнее о Механизм конфигурации DeltaSpike.
В этой ссылке вы найдете некоторую информацию о том, как настроить Apache DeltaSpike в вашем проекте.
Если вы используете Maven, в основном добавьте следующие зависимости к вашему pom.xml
:
<properties>
<deltaspike.version>1.5.0</deltaspike.version>
</properties>
<dependency>
<groupId>org.apache.deltaspike.core</groupId>
<artifactId>deltaspike-core-api</artifactId>
<version>${deltaspike.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.deltaspike.core</groupId>
<artifactId>deltaspike-core-impl</artifactId>
<version>${deltaspike.version}</version>
<scope>runtime</scope>
</dependency>
Проверьте версию Apache DeltaSpike, доступную на Репозиторий Maven.
Ответ 5
В этой ссылке есть несколько советов. Вы можете использовать ResourceBundle или сделать что-то вроде этого:
// Assuming you are in a Servlet extending HttpServlet
// This will look for a file called "/more/cowbell.properties" relative
// to your servlet Root Context
InputStream is = getServletContext().getResourceAsStream("/more/cowbell.properties");
Properties p = new Properties();
p.load(is);
is.close();
Рекомендуемый способ для меня - пойти с Spring, как предложил другой ответ.