Injecter un attribut statique en Spring

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 :

package com.spring.exemple;

public class Setting {
        public static final  String DEFAULT_DOMAIN="myorg";
}

Une classe Host définie comme suit :

package com.spring.exemple;

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 :

<bean class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
        <property name="staticField" value="com.spring.exemple.Setting.DEFAULT_DOMAIN" />
</bean>

Le code complet de Application-context.xml est :

<?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="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 :

package com.spring.exemple;

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 :

host : myHost(192.186.1.1)@myorg

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.

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 ?