2011-11-25 18 views
7

C'è un modo per usare <bean parent="someParent"> con annotazione @Component (creazione di bean di primavera usando l'annotazione)?@Componente con il genitore?

Vorrei creare un bean spring con "spring parent" utilizzando l'annotazione @Component.

è possibile?

+4

Non puoi semplicemente utilizzare l'ereditarietà? L'autowiring nella classe base funzionerà allo stesso modo. –

+1

@Tomasz Nurkiewicz Ho un bean padre primaverile definito in xml (ha alcune proprietà impostate su valori "predefiniti"). Non è qualcosa che posso cambiare. – IAdapter

+0

Ho aggiunto una risposta per spiegare ulteriormente la mia idea. Puoi elaborare un po 'di più perché non soddisfa le tue esigenze? Perché non puoi cambiare la definizione del genitore in XML? Temo che non sia possibile fare riferimento al genitore dall'annotazione ... –

risposta

3

Dopo il mio commento, questo pezzo di XML

<bean id="base" abstract="true"> 
    <property name="foo" ref="bar"/> 
</bean> 

<bean class="Wallace" parent="base"/> 
<bean class="Gromit" parent="base"/> 

è più o meno eqivalent a questo codice (da notare che ho creato artificiale Base classe dal fagioli astratti in primavera non hanno bisogno di un class):

public abstract class Base { 
    @Autowired 
    protected Foo foo; 
} 

@Component 
public class Wallace extends Base {} 

@Component 
public class Gromit extends Base {} 

Wallace e Gromit ora hanno accesso alla proprietà comune Foo. Inoltre, puoi ignorarlo, ad es. in @PostConstruct.

BTW Mi piaceva molto la funzione parent in XML che permetteva di mantenere i fagioli asciutti, ma l'approccio Java sembra ancora più pulito.

+3

Il tuo esempio non funzionerà se il bean 'base' sarà definito in XML, con o senza la creazione di classi' Bean' artificiali e 'Wallace' e' Gromit 'sarà creato da component-scan. –

0

appena incontrato lo stesso costrutto .. (un generale classe genitore astratta che ha usato Beans - con context.xml-dichiarazione per un'implementazione potenziale che è stato iniettato per componente-scan)

Questo è quello che ho potuto eseguite nella classe @Component:

@Autowired 
public void setBeanUsedInParent(BeanUsedInParent bean) { 
    super.setBeanUsedInParent(bean); 
} 

..che ho finito per fare (meglio, dal momento che rende chiaro che l'iniezione funziona sull'oggetto non su classi) - e se si è in grado di modificare la classe madre:

// abstract getter in parent Class 
public abstract BeanUsedInParent getBeanUsedInParent(); 

..leave i fagioli reali così come la loro iniezione fino alla realizzazione effettiva (la classe @Component):

@Autowired 
private BeanUsedInParent beanUsedInParent; 

@Override 
public BeanUsedInParent getBeanUsedInParent() { 
    return this.beanUsedInParent; 
} 
Problemi correlati