2010-07-29 8 views
2

dépendances Normalement, on injecte via normalisateurs par la configuration suivante (http://static.springsource.org/sprin...beans-beanname):Le conteneur Spring peut-il injecter des collaborateurs à l'aide de méthodes personnalisées?

<bean id="exampleBean" class="examples.ExampleBean"> 
    <!-- setter injection using the nested <ref/> element --> 
    <property name="beanOne"><ref bean="anotherExampleBean"/></property> 

    <!-- setter injection using the neater 'ref' attribute --> 
    <property name="beanTwo" ref="yetAnotherBean"/> 
    <property name="integerProperty" value="1"/> 
</bean> 

<bean id="anotherExampleBean" class="examples.AnotherBean"/> 
<bean id="yetAnotherBean" class="examples.YetAnotherBean"/> 

permet de dire que la classe a un examples.ExampleBean objets de collection d'auditeurs, et le procédé addListener(SomeListenerInterface) est le seul moyen possible d'ajouter des auditeurs. Puis-je injecter des écouteurs de manière déclarative dans xml comme c'est fait avec les setters de propriétés?

Répondre

2

Vous pourriez probablement évoquer un mécanisme baroque pour faire tout cela en XML, mais la plus propre façon de le faire est d'utiliser un FactoryBean. Vous écrivez une classe qui implémente FactoryBean et qui est responsable de la construction et de la configuration de votre objet cible (voir Spring docs). Votre FactoryBean aurait les getters/setters/autowiring requis, et les injecterait dans l'objet cible.

Ceci est souvent le moyen le plus propre de gérer les non-javabeans au printemps, en particulier si vous ne pouvez pas modifier la classe cible.

1

va ici la propriété Élément Définition

éléments de propriété correspondent à Javabean méthodes setter exposés par les classes de haricots.

Pour atteindre votre objectif, vous pouvez utiliser l'annotation @Autowired. Il fonctionne même en utilisant un nom arbitraire

@Autowired 
public void inject(SomeListenerInterface someListenerInterface) { 
    this.someListenerInterface = someListenerInterface; 
} 
+0

Cela est possible, mais cela injecterait automatiquement tous les beans 'SomeListenerInterface' dans tous les beans qui déclarent cet attribut. Quoi qu'il en soit, merci pour l'info, je ne savais pas à propos de cet attribut. –