2010-01-21 7 views
3

J'utilise Spring framework et je ne sais pas comment faire cette chose simple: Je veux fournir une chaîne à un haricot, avec la chaîne étant le résultat de la concaténation de partie multiple, certains fixes et d'autres variablesSpring - IoC Container - Comment utiliser les valeurs dynamiques dans les propriétés? (comme une concat de 2 cordes)

par exemple, il pourrait être quelque chose comme: "myReportFile_20102101_1832.txt" - la première partie est une partie fixe - la deuxième partie est un horodatage avec le temps de date - la dernière partie est une autre partie fixe

Comment réaliser cela de la manière la plus simple?

Merci beaucoup.

Répondre

6

Cela ressemble à un travail pour le Spring Expression Language (introduit au printemps 3.0) pour moi. Bien qu'il soit plus facile d'utiliser un factory bean pour cette tâche (il reçoit les informations statiques injectées via IOC et offre une méthode usine qui instancie votre autre bean incluant les informations dynamiques calculées). Comme si

class FileNameFactoryBean 
{ 
    private Date date = new Date(); 
    private String prefix; 
    private String postfix; 

    public OtherBean createBean() 
    { 
     String filename = prefix + date.toString() + postfix; 
     return new OtherBean(filename); 
    } 

    // Getters and Setters 
} 

Et puis dans votre configuration de haricot quelque chose comme

<bean id="fileNameFactory" class="package.FileNameFactoryBean"> 
    <property name="prefix" value="file_" /> 
    <property name="postfix" value=".txt" /> 
</bean> 

<bean id="otherBean" factory-bean="fileNameFactory" factory-method="createBean"/> 
+0

Merci beaucoup. J'ai trouvé le langage d'expression plus simple et naturel, mais comme je suis avec le printemps 2.5, je vais aller avec le Factory Bean. – Guillaume

3

Utilisez le MethodInvokingFactoryBean. Vous pouvez lui donner une méthode statique sur une autre classe qui prend un nom de fichier et y ajoute un horodatage, ou toute autre logique que vous aimeriez avoir. Voir le Javadoc pour plus d'informations et un exemple.

0

Vous pouvez déléguer cette logique à un init-method

<bean id="myBean" class="foo.MyBean" init-method="nameBuilder"> 
    <property name="pre" value="myReportFile_" /> 
    <property name="ext" value=".txt" /> 
</bean> 

puis dans votre classe Bean

public class MyBean { 
.... 
    public void nameBuilder() { 
     setName(pre+System.currentTimeMillis()+ext); //or anything you want.. 
    } 
} 
Questions connexes