J'utilise le printemps. J'ai besoin de lire les valeurs du fichier de propriétés. Ce fichier de propriétés interne n'est pas le fichier de propriétés externe. Le fichier de propriétés peut être comme ci-dessous.
some.properties ---file name. values are below.
abc = abc
def = dsd
ghi = weds
jil = sdd
Je dois lire ces valeurs à partir du fichier de propriétés de manière non traditionnelle. Comment y arriver? Y at-il une dernière approche avec le printemps 3.0?
Configurez PropertyPlaceholder dans votre contexte:
<context:property-placeholder location="classpath*:my.properties"/>
Ensuite, vous vous référez aux propriétés de vos haricots:
@Component
class MyClass {
@Value("${my.property.name}")
private String[] myValues;
}
EDIT: a mis à jour le code pour analyser la propriété avec plusieurs valeurs séparées par des virgules:
my.property.name=aaa,bbb,ccc
Si cela ne fonctionne pas, vous pouvez définir un bean avec des propriétés, l'injecter et le traiter manuellement:
<bean id="myProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath*:my.properties</value>
</list>
</property>
</bean>
et le haricot:
@Component
class MyClass {
@Resource(name="myProperties")
private Properties myProperties;
@PostConstruct
public void init() {
// do whatever you need with properties
}
}
En classe de configuration
@Configuration
@PropertySource("classpath:/com/myco/app.properties")
public class AppConfig {
@Autowired
Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setName(env.getProperty("testbean.name"));
return testBean;
}
}
Il y a différentes façons d'atteindre le même objectif. Vous trouverez ci-dessous quelques moyens couramment utilisés au printemps.
En utilisant PropertiesFactoryBean
et beaucoup plus........................
En supposant que ds.type
est la clé de votre fichier de propriétés.
Utilisation de PropertyPlaceholderConfigurer
Enregistrez PropertyPlaceholderConfigurer
bean-
<context:property-placeholder location="classpath:path/filename.properties"/>
ou
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:path/filename.properties" ></property>
</bean>
ou
@Configuration
public class SampleConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
//set locations as well.
}
}
Après avoir enregistré PropertySourcesPlaceholderConfigurer
, vous pouvez accéder à la valeur-
@Value("${ds.type}")private String attr;
Utilisation de PropertySource
Dans la dernière version du printemps, vous n'avez pas besoin d'enregistrer PropertyPlaceHolderConfigurer
avec @PropertySource
, j'ai trouvé un bon link pour comprendre la compatibilité des versions-
@PropertySource("classpath:path/filename.properties")
@Component
public class BeanTester {
@Autowired Environment environment;
public void execute() {
String attr = this.environment.getProperty("ds.type");
}
}
Utilisation de ResourceBundleMessageSource
Enregistrer Bean-
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:path/filename.properties</value>
</list>
</property>
</bean>
Valeur d'accès
((ApplicationContext)context).getMessage("ds.type", null, null);
ou
@Component
public class BeanTester {
@Autowired MessageSource messageSource;
public void execute() {
String attr = this.messageSource.getMessage("ds.type", null, null);
}
}
Utilisation de PropertiesFactoryBean
Enregistrer Bean-
<bean id="properties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="locations">
<list>
<value>classpath:path/filename.properties</value>
</list>
</property>
</bean>
Installez Wire Properties dans votre classe
@Component
public class BeanTester {
@Autowired Properties properties;
public void execute() {
String attr = properties.getProperty("ds.type");
}
}
Voici une réponse supplémentaire qui m'a également beaucoup aidé à comprendre comment cela fonctionnait: http://www.javacodegeeks.com/2013/07/spring-bean-and-propertyplaceholderconfigurer.html
tous les beans BeanFactoryPostProcessor doivent être déclarés avec un modificateur static
@Configuration
@PropertySource("classpath:root/test.props")
public class SampleConfig {
@Value("${test.prop}")
private String attr;
@Bean
public SampleService sampleService() {
return new SampleService(attr);
}
@Bean
public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Vous devez placer un bean PropertyPlaceholderConfigurer dans votre contexte d'application et définir sa propriété location.
Voir les détails ici: http://www.zparacha.com/how-to-read-properties-file-in-spring/
Vous devrez peut-être modifier un peu votre fichier de propriété pour que cela fonctionne.
J'espère que ça aide.
Si vous devez lire manuellement un fichier de propriétés sans utiliser @Value.
Merci pour la page bien écrite de Lokesh Gupta: Blog
package utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ResourceUtils;
import Java.io.FileInputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.util.Properties;
import Java.io.File;
public class Utils {
private static final Logger LOGGER = LoggerFactory.getLogger(Utils.class.getName());
public static Properties fetchProperties(){
Properties properties = new Properties();
try {
File file = ResourceUtils.getFile("classpath:application.properties");
InputStream in = new FileInputStream(file);
properties.load(in);
} catch (IOException e) {
LOGGER.error(e.getMessage());
}
return properties;
}
}
Une autre méthode consiste à utiliser un ResourceBundle . En gros, vous obtenez le paquet en utilisant son nom sans les '.properties'
private static final ResourceBundle resource = ResourceBundle.getBundle("config");
Et vous récupérez n'importe quelle valeur en utilisant ceci:
private final String prop = resource.getString("propName");
Je vous recommande de lire ce lien https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html depuis les documents SpringBoot sur l’injection de configurations externes. Ils ne parlent pas seulement de récupérer à partir d'un fichier de propriétés mais également de fichiers YAML et même JSON. J'ai trouvé ça utile. J'espère que vous aussi.
[project structure]: http://i.stack.imgur.com/RAGX3.jpg
-------------------------------
package beans;
import Java.util.Properties;
import Java.util.Set;
public class PropertiesBeans {
private Properties properties;
public void setProperties(Properties properties) {
this.properties = properties;
}
public void getProperty(){
Set keys = properties.keySet();
for (Object key : keys) {
System.out.println(key+" : "+properties.getProperty(key.toString()));
}
}
}
----------------------------
package beans;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext ap = new ClassPathXmlApplicationContext("resource/spring.xml");
PropertiesBeans p = (PropertiesBeans)ap.getBean("p");
p.getProperty();
}
}
----------------------------
- driver.properties
Driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/test
username = root
password = root
----------------------------
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">
<bean id="p" class="beans.PropertiesBeans">
<property name="properties">
<util:properties location="classpath:resource/driver.properties"/>
</property>
</bean>
</beans>