Injecter le résultat d’une méthode statique dans un bean Spring

Il est possible d’injecter le résultat d’une méthode statique dans un bean Spring, comme indiqué dans l’article « Injecter un attribut statique en Spring », Cet article présentera donc la manière par la quelle on peut utiliser les méthodes statiques dans Spring via un exemple qui utilisera trois classes java et un fichier XML Spring.

On utilisera la même logique que « Injecter un attribut statique en Spring », donc cet exemple sera composé de 3 classes (Setting.java, Host.java et Main.java) et un contexte Spring (Application-context.xml).

La classe Host est définie comme suit :

package com.spring.exemple;

public class Host {

private String hostName;

private String ip;

private String userName;

private String userMail;

private String adminMail;

public String getIp() {
return ip;
}

public void setIp(String ip) {
this.ip = ip;
}

public String getHostName() {
return hostName;
}

public void setHostName(String hostName) {
this.hostName = hostName;
}

public String getAdminMail() {
return adminMail;
}

public void setAdminMail(String adminMail) {
this.adminMail = adminMail;
}

public String getUserMail() {
return userMail;
}

public void setUserMail(String userMail) {
this.userMail = userMail;
}

public String getUserName() {
return userName;
}

public void setUserName(String userName) {
this.userName = userName;
}

public String toString()
{
StringBuffer toString = new StringBuffer();
toString.append("hostName : ").append(hostName).append("\n")
.append("ip :").append(ip).append("\n")
.append("adminMail :").append(adminMail).append("\n")
.append("userName :").append(userName).append("\n")
.append("userMail :").append(userMail).append("\n");
return toString.toString();
}
}

La classe Setting est la classe qui contient les méthodes statiques dont le résultat sera injecté dans les beans Spring:

package com.spring.exemple;

public class Setting {

public static final String DEFAULT_DOMAIN="myorg";
private static final String DEFAULT_ADMIN="root";

public static String buildAdminMail()
{
return DEFAULT_ADMIN + "@" + DEFAULT_DOMAIN;
}

public static String buildUserMail(String user)
{
return user + "@" + DEFAULT_DOMAIN;
}
}

Cette Classe contient deux méthodes statistiques (avec et sans paramètres): buildAdminMail pour générer le mail de l’administrateur du domaine et buildUserMail qui permet de générer le mail d’un utilisateur passé en paramètres. L’intérêt d’avoir deux méthodes et de voir la différence de la syntaxe Spring lors de la déclaration des beans.

L’idée de cet exemple et d’injecter le résultat des méthodes buildAdminMail et buildUserMail dans les attributs adminMail et userMail d’un objet Host.

Pour injecter le résultat d‘une méthode statique dans un bean, il faut créer un bean de la classe « org.springframework.beans.factory.config.MethodInvokingFactoryBean » qui dispose de deux attributs essentiels :

  • staticMethod : définie la méthode statique à invoquer.
  • Arguments : définie la liste des paramètres à passer à la méthode. Cet attribut est réservé aux méthodes qui nécessitent des paramètres.

Le bean qui encapsulera le résultat de la méthode buildAdminMail sera définie comme suit :

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="staticMethod">
                <value>com.spring.exemple.Setting.buildAdminMail</value>
        </property>
</bean>

Quant au bean qui représentera le résultat de la méthode buildUserMail sera défini comme suit :

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod">
                <value>com.spring.exemple.Setting.buildUserMail</value>
        </property>
        <property name="arguments">
                <list>
                        <value>khalid</value>
                </list>
        </property>
</bean>

Le contenu l’application context est le suivant :

<?xml version="1.0" encoding="UTF-8"?>
<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"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                                                http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                       http://www.springframework.org/schema/context
                       http://www.springframework.org/schema/context/spring-context-2.5.xsd">

        <bean id="myHost" class="com.spring.exemple.Host">
                <property name="hostName" value="myHost" />
                <property name="ip" value="192.186.1.1" />
                <property name="userName" value="khalid" />
                <property name="adminMail">
                        <bean
                                class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                                <property name="staticMethod">
                                        <value>com.spring.exemple.Setting.buildAdminMail</value>
                                </property>
                        </bean>
                </property>
                <property name="userMail">
                        <bean
                                class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
                                <property name="staticMethod">
                                        <value>com.spring.exemple.Setting.buildUserMail</value>
                                </property>
                                <property name="arguments">
                                        <list>
                                                <value>khalid</value>
                                        </list>
                                </property>
                        </bean>
                </property>
        </bean>
</beans>

Pour le test, il suffit de récupérer le bean « myHost » et faire appel à son toString, le code de main est :

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {

public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext(
"com/spring/resources/Application-context.xml");

Host defaultHost = (Host) context.getBean("myHost");
System.out.println(defaultHost.toString());
}

}

Le résultat de test doit être comme suit :

hostName : myHost
ip :192.186.1.1
adminMail :root@myorg
userName :khalid
userMail :khalid@myorg

 

A propos de l'auteur

Faut il vraiment porter des lunettes, pour travailler la nuit, sur un terminal vert sur noire, pour être Geek pour devenir root ?