Lors de l’évolution d’un framework Java, on avait besoin d’utiliser des attributs statique qu’on peut injecter dans des beans Spring. Ce cas on ne le rencontre pas souvent, et c’est pour cette raison que j’ai décidé de faire un bout de code (java/Spring) permettant de voir comment peut-on injecter la valeur d’un attribut statique dans un bean Spring.
L’exemple comporte deux classes (Setting.java et Host.java) plus un main (Main.java) et un contexte Spring (Application-context.xml). La classe Setting qui contint l’attribut statique. Son code est le suivant :
public class Setting {
public static final String DEFAULT_DOMAIN="myorg";
}
Une classe Host définie comme suit :
public class Host {
private String hostName;
private String ip;
private String domaine;
public String getDomaine() {
return domaine;
}
public void setDomaine(String domaine) {
this.domaine = domaine;
}
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 toString() {
return "host : " + hostName + "(" + ip + ")@" + domaine;
}
}
L’idée est de créer un bean de Host dont la valeur de l’attribut « domaine » est la valeur de l’attribut statique « DEFAULT_DOMAINE ». Pour réaliser ce cas, il faut créer un bean de la classe Spring « org.springframework.beans.factory.config.FieldRetrievingFactoryBean » qui contient le champ « staticField » qui sert à récupérer le champ statique.
Pour cet exemple le bean sera comme suit :
<property name="staticField" value="com.spring.exemple.Setting.DEFAULT_DOMAIN" />
</bean>
Le code complet de Application-context.xml est :
<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="defaultHost" class="com.spring.exemple.Host">
<property name="hostName" value="myHost" />
<property name="ip" value="192.186.1.1" />
<property name="domaine">
<bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
<property name="staticField" value="com.spring.exemple.Setting.DEFAULT_DOMAIN" />
</bean>
</property>
</bean>
</beans>
Pour le test, il suffit de récupérer le bean « defaultHost » 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("defaultHost");
System.out.println(defaultHost.toString());
}
}
Le résultat de test doit être comme suit :
Il est possible également d’injecter le résultat d’une méthode statique dans une propriété d’un bean, elle sera traitée dans un autre article incheallah.