|
Un simple exemple avec Spring et Hivemind
|  |
Un premier pas avec Spring et Hivemind
Objectif:
- Comprendre le principe de fonctionnement de Spring / HiveMind
- Comprendre le rôle du descripteur XML des composants
Description:
Cet exemple implémente un composant dont l'interface Parrot fournie une méthode repeatWhatISay(String whatIsay). Pour indication, Parrot c'est un perroquet.
Cette interface possède deux implémentations: ParrotImpl et StupidParrotImpl.
Le programme de test créé un exemplaire des deux composants et déclenche la méthode pour tester.
Code source du composant:
Parrot.java contient le code source de l'interface du composant:
package com.btc.ioc_ex1;
public interface Parrot {
public String repeatWhatISay(String say);
}
ParrotImpl.java contient la première implémentation du composant:
package com.btc.ioc_ex1;
public class ParrotImpl implements Parrot {
public String repeatWhatISay(String say) {
return say;
}
}
StupidParrotImpl.java contient l'implémentation du second composant:
package com.btc.ioc_ex1;
public class StupidParrotImpl implements Parrot {
public String repeatWhatISay(String say) {
return "e=mc2";
}
}
Maintenant nous allons voir comment utiliser ce composant avec Spring et Hivemind :
Ecriture du programme de test:
| |
Spring |
HiveMind |
| Créer un descriteur XML |
Vous devez déclarer les composants de votre application dans un ou plusieurs fichiers XML. Ce fichier donne un nom logique à chaque composant, ce nom étant utilisé pour pouvoir créer un composant dans votre application. Le fichier XML contient au minimum avec l'id du composant, sa classe d'implémentation.
Les composants sont appelés dans le fichier XML:
- Des beans avec Spring
- Des service-point avec HiveMind
Dans notre exemple, nous déclarons deux composants parrot et stupidparrot qui ont la même interface, mais deux implémentations différentes. L'application ne connait que l'interface du composant, et ignore complètement quelle est la classe d'implémentation. |
|
Fichier parrot-spring.xml
<beans> <bean id="com.btc.ioc_ex1.parrot" class="com.btc.ioc_ex1.ParrotImpl"/> <bean id="com.btc.ioc_ex1.stupidparrot" class="com.btc.ioc_ex1.StupidParrotImpl"/> </beans>
|
Fichier parrot-hivemind.xml
<module id="com.btc.ioc_ex1" version="1.0.0" package="com.btc.ioc_ex1">
<service-point id="parrot" interface="Parrot"> <create-instance class="ParrotImpl"/> </service-point>
<service-point id="stupidparrot" interface="Parrot">
<create-instance class="StupidParrotImpl"/>
</service-point>
</module>
|
| Créer le programme de test |
Les composants sont créés à partir de leur description dans le fichier XML par une classe fournie par le framework:
- Avec Hivemind, la classe est Registry
- Avec Spring, la classe est BeanFactory (ou une sous classe comme XMLBeanFactory)
Hivemind / Spring se charge de créer les composants en utilisant de nombreuses solutions:
- Invocation du constructeur
- Utilisation d'une factory
- Invocation d'une méthode statique
L'invocation de BeanFactory.getBean ou de Registry.getService provoquent la création d'un composant par le framework.
|
|
package com.btc.ioc_ex1;
import junit.framework.*;
import org.springframework.beans.factory.xml.*;
import org.springframework.core.io.*;
import org.apache.log4j.*;
public class ParrotSpTest extends TestCase {
private XmlBeanFactory _factory;
private static final int MAXRUN = 1000;
public void setUp() throws Exception {
BasicConfigurator.configure();
ClassPathResource res = new ClassPathResource("/com/btc/ioc_ex1/parrot-spring.xml");
_factory = new XmlBeanFactory(res);
}
public void testSpring() throws Exception {
final String sayThat = "Hello parrot";
Parrot parrot = (Parrot)_factory.getBean("com.btc.ioc_ex1.parrot", Parrot.class);
for(int i = 0; i < MAXRUN; i++)
assertEquals(sayThat, parrot.repeatWhatISay(sayThat));
parrot = (Parrot)_factory.getBean("com.btc.ioc_ex1.stupidparrot", Parrot.class);
for(int i = 0; i < MAXRUN; i++)
assertEquals("e=mc2", parrot.repeatWhatISay(sayThat));
}
}
|
package com.btc.ioc_ex1;
import org.apache.hivemind.*;
import org.apache.hivemind.test.*;
import org.apache.log4j.*;
public class ParrotHwTest extends HiveMindTestCase {
private Registry _registry;
private static final int MAXRUN = 1000;
public void setUp() throws Exception {
BasicConfigurator.configure();
_registry = buildFrameworkRegistry("/com/btc/ioc_ex1/parrot-hivemind.xml");
}
public void testSpring() throws Exception {
final String sayThat = "Hello parrot";
Parrot parrot = (Parrot) _registry.getService("com.btc.ioc_ex1.parrot", Parrot.class);
for(int i = 0; i < MAXRUN; i++)
assertEquals(sayThat, parrot.repeatWhatISay(sayThat));
parrot = (Parrot) _registry.getService("com.btc.ioc_ex1.stupidparrot", Parrot.class);
for(int i = 0; i < MAXRUN; i++)
assertEquals("e=mc2", parrot.repeatWhatISay(sayThat));
}
}
|
| Compiler et exécuter l'exemple |
- Modifiez le fichier build.xml qui contient les chemins vers les librairies citées ci dessus
|
|
|