2013-05-27 8 views
0

J'ai la situation suivante.Injecter la propriété du haricot à partir du haricot externe

j'ai deux haricots, par exemple:

<bean id="service1" parent="txProxyTemplate"> 
    <property name="target"> 
     <bean autowire="byName" class="Class1"/> 
    </property> 
</bean> 

<bean name="manager1" parent="txProxyServiceTemplate"> 
    <property name="target"> 
     <bean autowire="byName" class="ManagerClass1"/ 
    </property> 
</bean> 

Et j'ai troisième haricot qui est vraiment injecté dans ces deux Baens:

<bean name="supportBean" parent="txProxyServiceTemplate"> 
    <property name="target"> 
     <bean autowire="byName" class="SupportBeanClass"> 
     </bean> 
    </property> 
</bean> 

Il est le champ « path » de chaîne dans les haricots service1 (chemin = "premier chemin") et manager1 (chemin = "second chemin"). Lorsque supportBean est injecté dans service1 et manager1, je souhaite qu'un champ chaîne dans supportBean (par exemple "actualPath") soit automatiquement initialisé à partir de deux beans englobants. Comment pourrais-je faire cela au printemps?

PS: je dois que service1 et manager1 ont supportBean avec deux champs distincts (en classe service1 supportBean a actualPath = "premier chemin", en classe manager1 supportBean a actualPath = « deuxième chemin)

J'espère que vous avez compris moi, Merci!

Répondre

1

Sans avoir vu un code réel, pourriez-vous pas régler la actualPath sur le SupportBean dans le setter du grain renfermant? le SupportBean aurait besoin d'avoir une portée de prototype pour que l'état séparé pourrait être maintenu

Alors pour exemple r, si votre SupportBean avait l'air quelque chose comme ceci:

@Component 
@Scope("prototype") 
public class SupportBean { 

    private String actualPath; 

    public void setActualPath(String actualPath) { 
     this.actualPath = actualPath 
    } 
} 

Ensuite, vous pouvez définir le chemin réel sur le SupportBean dans le setter dans le haricot englobante. Alors Service1 pourrait ressembler à ceci:

@Service 
public class Service1 { 

    private String path = "first path"; 
    private SupportBean supportBean; 

    @Autowired 
    public void setSupportBean(SupportBean supportBean) { 
     this.supportBean = supportBean; 
     this.supportBean.setActualPath(this.path); 
    } 
} 

Et Manager1 comme ceci:

@Service 
public class Manager1 { 

    private String path = "second path"; 
    private SupportBean supportBean; 

    @Autowired 
    public void setSupportBean(SupportBean supportBean) { 
     this.supportBean = supportBean; 
     this.supportBean.setActualPath(this.path); 
    } 
} 

Si vous préférez utiliser l'injection de constructeur puis juste laisser tomber le setter et lier automatiquement le constructeur:

@Service 
public class Service1 { 

    private String path = "first path"; 
    private SupportBean supportBean; 

    @Autowired 
    public Service1(SupportBean supportBean) { 
     this.supportBean = supportBean; 
     this.supportBean.setActualPath(this.path); 
    } 
} 
+0

C'est une variante assez sympa, merci :) Mais comment puis-je éviter le réglage "chemin" à travers setter? Est-ce que je peux faire ceci d'une manière ou d'une autre par le constructeur? – Dedyshka

+0

@Dedyshka - Vous pouvez utiliser l'injection de constructeur pour autowire le service. Si vous voulez dire s'il est possible de définir le chemin réel sur le 'SupportBean' via son constructeur - ce serait plus difficile car Spring a déjà créé le' SupportBean' au moment où il autowires les services. Vous pourriez être en mesure de créer un 'SupportBeanFactory' ou similaire et autowire à la place. L'usine pourrait alors créer le 'SupportBean' fournissant le chemin pertinent au constructeur' SupportBean'. Cela dépendrait vraiment de ce que vous essayez d'accomplir. –

Questions connexes