| Ce site met a disposition le build journalier de la traduction francaise du Maven: The Definitive Guide Consultez : | ![]() |
Le prochain module que nous allons examiner pourrait être considéré comme un “service”.
Ce module contient toute la logique nécessaire pour récupérer et parser les données provenant du flux RSS Yahoo! Météo.
Bien qu'il ne contienne que trois classes Java et un test JUnit,
il permet d'exposer un composant simple, WeatherService, qui sera utilisé
par l'application web et par l'application en ligne de commande.
Un projet d'entreprise contient très souvent plusieurs modules API
permettant de centraliser la logique métier et les interactions avec des systèmes externes.
Un système bancaire pourrait avoir un module qui récupère et analyse des données provenant d'un fournisseur tiers,
et un système affichant des résultats sportifs pourrait interagir avec un flux XML
qui fourit les scores du basket ou du football en temps réel.
Dans l'Exemple 7.5, « POM du module simple-weather », ce module renferme toute l'activité réseau et le parsing du flux XML provenant du service Yahoo! Météo.
Les autres modules peuvent dépendre de celui-ci et simplement appeler la méthode retrieveForecast() du service WeatherService
qui prend en paramètre un code postal et retourne un objet Weather.
Exemple 7.5. POM du module simple-weather
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.sonatype.mavenbook.multispring</groupId> <artifactId>simple-parent</artifactId> <version>1.0</version> </parent> <artifactId>simple-weather</artifactId> <packaging>jar</packaging> <name>Simple Weather API</name> <dependencies> <dependency> <groupId>org.sonatype.mavenbook.multispring</groupId> <artifactId>simple-model</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency> <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> <scope>test</scope> </dependency> </dependencies> </project>
Le POM du module simple-weather étend
celui du simple-parent, configure le type de packaging à jar
et ajoute les dépendances suivantes :
org.sonatype.mavenbook.multispring:simple-model:1.0Le module simple-weather parse et le transforme le flux RSS Yahoo! Météo en objet Weather.
Il a donc une dépendance directe sur le module simple-model.
log4j:log4j:1.2.14Le module simple-weather utilise Log4J pour afficher ses messages de log.
dom4j:dom4j:1.6.1 et jaxen:jaxen:1.1.1Ces deux dépendances sont utilisées pour parser le XML provenant de Yahoo! Météo.
org.apache.commons:commons-io:1.3.2
(scope=test)Cette dépendance dont le scope est test est utilisée par YahooParserTest.
Analysons maintenant le service WeatherService de l'Exemple 7.6, « La classe WeatherService ».
Cette classe ressemble beaucoup au service WeatherService de l'Exemple 6.3, « La classe WeatherService ».
Bien qu'ils aient le même nom, le service de cet exemple comporte quelques légères différences.
Dans cette version, la méthode retrieveForecast() retourne un objet Weather
et le formatage est délégué à l'application appelant le service WeatherService.
L'autre modification majeure concerne les classes YahooRetriever et YahooParser,
qui sont maintenant des propriétés du service WeatherService.
Exemple 7.6. La classe WeatherService
package org.sonatype.mavenbook.weather;
import java.io.InputStream;
import org.sonatype.mavenbook.weather.model.Weather;
public class WeatherService {
private YahooRetriever yahooRetriever;
private YahooParser yahooParser;
public WeatherService() {}
public Weather retrieveForecast(String zip) throws Exception {
// Récupération des données
InputStream dataIn = yahooRetriever.retrieve(zip);
// Parsing des données
Weather weather = yahooParser.parse(zip, dataIn);
return weather;
}
public YahooRetriever getYahooRetriever() {
return yahooRetriever;
}
public void setYahooRetriever(YahooRetriever yahooRetriever) {
this.yahooRetriever = yahooRetriever;
}
public YahooParser getYahooParser() {
return yahooParser;
}
public void setYahooParser(YahooParser yahooParser) {
this.yahooParser = yahooParser;
}
}
Pour finir, ce projet contient un fichier XML utilisé par Spring pour
créer ce qu'on appelle l' ApplicationContext dont voici le fonctionnement :
nos applications web et en ligne de commande ont besoin d'interagir avec le service
WeatherService, pour cela elles récupèrent une instance de cette classe par l'intermédiaire
de l'ApplicationContext Spring en utilisant le nom de bean weatherService.
Notre application web utilise un contrôleur Spring MVC, celui-ci est associé à une instance du service WeatherService.
L'application en ligne de commande charge ce même service à partir de la méthode statique main() grâce à l'ApplicationContext.
Afin d'encourager la réutilisation du code, nous avons inclus le fichier applicationContext-weather.xml dans le répertoire src/main/resources, le rendant ainsi accessible dans le classpath.
Les projets qui dépendent du module simple-weather peuvent donc charger ce fichier en utilisant la classe ClasspathXmlApplicationContext fournie par Spring
et ainsi récupérer une instance du service WeatherService par l'intermédiaire de son nom : weatherService.
Exemple 7.7. ApplicationContext Spring du module simple-weather
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd default-lazy-init="true"> <bean id="weatherService" class="org.sonatype.mavenbook.weather.WeatherService"> <property name="yahooRetriever" ref="yahooRetriever"/> <property name="yahooParser" ref="yahooParser"/> </bean> <bean id="yahooRetriever" class="org.sonatype.mavenbook.weather.YahooRetriever"/> <bean id="yahooParser" class="org.sonatype.mavenbook.weather.YahooParser"/> </beans>
Ce fichier déclare trois beans : yahooParser, yahooRetriever et weatherService.
Le bean weatherService est une instance du service WeatherService.
Le fichier XML configure également les propriétés de ce bean
yahooParser et yahooRetriever qui référencent les noms des deux instances de
classes en question.
Vous pouvez comparer ce fichier applicationContext-weather.xml à la définition de l'architecture d'un sous-système de ce projet multimodule.
Certains projets comme simple-webapp et simple-command peuvent référencer ce contexte
et récupérer une instance du service WeatherService configurée avec des instances des classes YahooRetriever et YahooParser en propriété.