web-dev-qa-db-fra.com

Injecter la dépendance du ressort dans la super classe abstraite

J'ai besoin d'injecter de la dépendance dans une superclasse abstraite en utilisant un framework Spring.

class A extends AbstractClassB{ 
    private Xdao daox ;
    ...
    public setXdao() { ... }
}

class AbstractClassB{
    ..
    private yDao  daoy;
    public seyYdao() { ... }
}

J'ai besoin de passer la dépendance de superclasse chaque fois que j'instancie la classe abstraite B (qui peut être sous-classée de 100 manières dans mon projet)

entrée dans application.xml (fichier de contexte Spring)

<bean id="aClass" class="com.mypro.A" 
    <property name="daox" ref="SomeXDaoClassRef" /> 
    <property name="daoy" ref="SomeYDaoClassRef"/>
</bean>

Comment puis-je simplement créer une référence de bean de la super classe AbstractClassB dans application.xml afin de pouvoir l'utiliser dans toutes les créations de bean de sous-classe?

27
bob

Vous pouvez créer une définition de bean abstraite, puis "sous-taper" cette définition, par exemple.

<bean id="b" abstract="true" class="com.mypro.AbstractClassB">
    <property name="daox" ref="SomeXDaoClassRef" /> 
</bean>

<bean id="a" parent="b" class="com.mypro.A">
    <property name="daoy" ref="SomeYDaoClassRef" /> 
</bean>

À strictement parler, la définition de b ne vous oblige même pas à spécifier la classe, vous pouvez laisser cela de côté:

<bean id="b" abstract="true">
    <property name="daox" ref="SomeXDaoClassRef" /> 
</bean>

<bean id="a" parent="b" class="com.mypro.A">
    <property name="daoy" ref="SomeYDaoClassRef" /> 
</bean>

Cependant, pour plus de clarté et pour donner à vos outils une meilleure chance de vous aider, il est souvent préférable de le laisser.

Section 3.7 du manuel Spring traite de l'héritage de la définition du bean.

37
skaffman

Vous pouvez utiliser l'indicateur abstract de Spring pour indiquer à Spring qu'une classe est abstraite. Ensuite, toutes les implémentations concrètes peuvent simplement marquer ce bean comme leur bean parent.

<bean id="abstractClassB" class="AbstractClassB" abstract="true">
  <property name="yDao" ref="yDao" />
</bean>

<bean id="classA" class="A" parent="abstractClassB">
  <property name="xDao" ref="xDao" />
</bean>
3
peakit
2
duffymo