2009-07-23 9 views
1

je lis sur noms de propriété composés dans le « The Spring Framework (2.5) - Reference Documentation - chapter 3.3.2.7 »Y at-il des valeurs de propriétés composées au printemps

Puis-je utiliser le même concept pour définir les valeurs des propriétés? Puis-je utiliser une chaîne composée comme une expression de valeur?

<bean id="service1" class="a.b.c.Service1Impl" scope="prototype"> 
    <property name="service2" ref="service2"/> 
    <property name="service2.user" value="this-service1-instance.user"/> 
</bean> 
<bean id="service2" class="a.b.c.Service2Impl" scope="prototype"> 
    ... 
</bean> 

L'utilisateur est une propriété de a.b.c.Service1Impl qui est pas dans le contrôle du printemps. Je veux transférer cette propriété à a.b.c.Service2Impl.

Répondre

2

Plutôt que d'utiliser un haricot d'usine ancienne plaine, utilisez plutôt une méthode de fabrication pour créer le grain de la propriété puis injecter ce résultat ...

OIEau

dans votre cas, il ressemblerait à quelque chose comme this ...

<!-- the bean to be created via the factory bean --> 
<bean id="exampleBean" 
     factory-bean="serviceLocator" 
     factory-method="createInstance"/> 

Ainsi, le haricot de id est créé en appelant createInstance sur ServiceLocator de haricots.

Maintenant, le printemps ne prend pas en charge les propriétés imbriquées prêtes à l'emploi, mais vous pourriez envisager de créer un éditeur personnalisé qui pourrait fournir ce support - possible mais difficile. Peut-être ne vaut pas la peine.

Un mécanisme que vous pourriez envisager d'utiliser l'imbrication est en utilisant la technique usine méthode haricots usine ...

Quelque chose comme:

<bean id="c" class="C" /> 
<bean id="b" factory-bean="c" factory-method="getB"/> 
<bean id="a" factory-bean="b" factory-method="getA"/> 

Cela permettra d'exposer efficacement: abc où C a une méthode getB et A a une méthode getB

+0

Je suis nul à vie, c'est beaucoup mieux. –

0

La syntaxe de câblage XML de Spring prend en charge les listes, les mappes et les objets de propriétés, et vous pouvez créer d'autres objets 'data' via les éditeurs de propriétés. Edit: (Oh je vois ce que vous demandez.) Je pense que la réponse est non. Je ne me souviens pas d'avoir vu parler d'appel de getters sur un objet bean ou non-bean dans la documentation Spring, sans parler d'une syntaxe pour le faire dans le fichier de câblage. Cela a tendance à aller à contre-courant. Le câblage à ressort est déclaratif, et l'appel d'un getter conduirait à des modèles proches de la procédure.

1

Je devais faire quelque chose de similaire, et je crains que ce ne soit pas possible. Je devais écrire un [FactoryBean][1] pour exposer la propriété.

Il ressemblerait à quelque chose comme ceci:

public class UserFactory implements BeanFactory { 
    private Service2 service2; 
    // ... setter and getter for service2 

    public Object getObject() { 
     return getService2().getUser(); 
    } 

    public Class getObjectType() { 
     return User.class; 
    } 

    public boolean isSingleton() { 
     // Since it's a prototype in your case 
     return false; 
    } 
} 

Venez y penser, dans votre cas, vous définissez probablement la même usine comme un prototype, auquel cas votre isSingleton() peut retourner vrai, vous Je vais devoir jouer avec ça un peu.

Questions connexes