Dé-switcher n’est toujours pas jouer.

Je poste cet article en rapport avec un autre article de Pierre-Yves où il donne plusieurs exemples de solutions pour se passer des switchs.

J’ai récemment trouver un moyen sympa de me passer d’un switch en utilisant Spring. Cette solution est très inspirée de celle de Pierre-Yves qui consiste à utiliser des maps et des threads sauf que là, j’utilise des beans springs chargés dans une map.

Les déclarations des beans et de la map s’effectuent dans mon applicationContext de la manière suivante :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       ...
       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">

   
    <context:component-scan base-package="path.to.my.deswitched"/>

    <util:map id="messageProcessorMap">
        <entry key="first"  value-ref="myFirstMessageProcessor"/>
        <entry key="second"  value-ref="mySecondMessageProcessor"/>
        <entry key="third"  value-ref="myThirdMessageProcessor"/>
    </util:map>

    <bean id="myFirstMessageProcessor" class="path.to.my.FirstMessageProcessor"/>
    <bean id="mySecondMessageProcessor" class="path.to.my.SecondMessageProcessor"/>
    <bean id="myThirdMessageProcessor" class="path.to.my.ThirdMessageProcessor"/>

Ma classe java changera de messageProcessor pour traiter un message donné en fonction de la clé utilisée :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component
public class MyDeswitchedClass {

    @Resource
    Map<String, MessageProcessor> messageProcessorMap;

    public void setMessageProcessorMap(
        Map<String, MessageProcessor> messageProcessorMap) {
        this.messageProcessorMap = messageProcessorMap;
    }

    public String process( String type, String message){
        MessageProcessor messageProcessor = messageProcessorMap.get(type);
        if(messageProcessor==null){
            throw new IllegalArgumentException("the [type] path parameter does not match an existing message processor.");
        }
       
        String result = messageProcessor.processMessage(message);
        return result;
    }
}

Notez que cette solution présente des limitations :

  • Les objets de la map implémentent de préférence la même interface a moins de vouloir faire de l’introspection ou des “instance of” qui ruinent l’intérêt de cette solution.
  • Il faut pouvoir charger la classe MyDeswitchedClass avec Spring pour permettre l’injection de dépendances. Selon les projets/contraintes, Spring n’est pas toujours disponible ou il peut être imposé que l’instanciation de la classe soit prise en charge par un autre composant.

Les avantages de cette solution :

  • On peut définir et rajouter par configuration autant de messageProcessor que l’on veut sans avoir à modifier une seule ligne de code de la classe MyDeswitchedClass
  • Mes messagesProcessors profitent des avantages inhérents à Spring lui-même (découplage, prise en charge de l’instanciation et de la configuration des beans par le framework, etc…).
VN:R_U [1.9.22_1171]
Rating: 0 (from 0 votes)
Share
Ce contenu a été publié dans Java, Non classé, Spring, Trucs & astuces, avec comme mot(s)-clef(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire