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 :
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:
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 :
<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 :
<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 :
<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.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 :
ip :192.186.1.1
adminMail :root@myorg
userName :khalid
userMail :khalid@myorg