web-dev-qa-db-fra.com

comment lire le fichier de propriétés dans le projet de printemps?

Avant de publier cette question, je recherche sur Google les propriétés du projet Spring (ce n'est PAS un projet Web). Je suis confus car tout le monde parle d'application-context.xml et j'ai une configuration comme

Cependant, je travaille sur un projet normal Java avec Spring (AUCUNE application Web et des trucs comme ça). Mais je voudrais obtenir des propriétés communes du fichier de propriétés et qui doivent être utilisées dans Java. Comment y parvenir en utilisant Spring/Spring Annotations?

Où dois-je configurer le fichier myprops.properties sous mon projet et comment l'invoquer au printemps?

Ma compréhension est application-context.xml est utilisé UNIQUEMENT pour les projets basés sur le Web. Sinon, comment dois-je configurer cette application-context.xml car je n'ai PAS web.xml pour définir l'application-context.xml

14
Sriks

Vous pouvez créer un contexte d'application basé sur XML comme:

ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");

si le fichier xml se trouve sur votre chemin de classe. Alternativement, vous pouvez utiliser un fichier sur le système de fichiers:

ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");

Plus d'informations sont disponibles dans le Spring reference docs . Vous devez également enregistrer un hook d'arrêt pour assurer un arrêt progressif:

 ctx.registerShutdownHook();

Ensuite, vous pouvez utiliser PropertyPlaceHolderConfigurer pour extraire les propriétés d'un fichier '.properties' et les injecter dans vos beans:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:com/foo/jdbc.properties"/>
</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>

Enfin, si vous préférez une configuration basée sur des annotations, vous pouvez utiliser le @Value annotation pour injecter des propriétés dans vos beans:

@Component
public class SomeBean {

    @Value("${jdbc.url}") 
    private String jdbcUrl;
}
24
matsev

Depuis Spring 4, vous pouvez utiliser l'annotation @ PropertySource dans Spring @Configuration classe:

@Configuration
@PropertySource("application.properties")
public class ApplicationConfig {

    // more config ...
}

Si vous souhaitez avoir votre configuration en dehors de votre chemin de classe, vous pouvez utiliser le file: préfixe:

@PropertySource("file:/path/to/application.properties")

Vous pouvez également utiliser une variable d'environnement pour définir le fichier

@PropertySource("file:${APP_PROPERTIES}")

APP_PROPERTIES est une variable d'environnement qui a la valeur de l'emplacement du fichier de propriétés, par exemple /path/to/application.properties.

Veuillez lire mon article de blog Spring @PropertySource pour plus d'informations sur @PropertySource, son utilisation, comment les valeurs de propriété peuvent être remplacées et comment les sources de propriété facultatives peuvent être spécifiées.

6
matsev

Vous n'avez pas besoin d'utiliser Spring. Vous pouvez lire en clair Java comme ceci:

Properties properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName));
3
jediz

Pouvez-vous comprendre comment votre projet sera utilisé dans l'ensemble de l'application? Si votre projet est utilisé comme chemin de génération pour une application Web et que la configuration de votre projet est réalisée par le biais d'annotations de printemps, vous êtes sans doute perplexe quant à la façon d'ajouter un fichier application.xml. Ma suggestion est que vous devez annoncer les gars qui utiliseront votre projet, leur dire ce dont vous avez besoin et il vous suffit d'ajouter @Value("${valuename}") dans votre code.

0
Evan Hu