2011-11-25 19 views
7

¿Hay alguna manera de utilizar <bean parent="someParent"> con la anotación @Component (creación de frijol de primavera utilizando anotación)?@Component con el padre?

Me gustaría crear frijol de primavera que tiene "padre de primavera" por medio de anotación @Component.

es posible?

+4

no puedes utilizar la herencia? El autocableado en la clase base funcionará de la misma manera. –

+1

@Tomasz Nurkiewicz Tengo Spring Parent Bean definido en xml (tiene algunas propiedades establecidas en valores "predeterminados"). Eso no es algo que pueda cambiar. – IAdapter

+0

Agregué una respuesta para explicar mejor mi idea. ¿Puede explicar un poco más por qué no se ajusta a sus necesidades? ¿Por qué no puedes cambiar la definición padre en XML? Me temo que no es posible hacer referencia a los padres de anotación ... –

Respuesta

3

Después de mi comentario, esta pieza de XML

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

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

es más o menos eqivalent a este código (tenga en cuenta que creé artificial clase Base desde las habas abstractas en primavera no necesitan un class):

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

@Component 
public class Wallace extends Base {} 

@Component 
public class Gromit extends Base {} 

Wallace y Gromit ahora tienen acceso a la propiedad Foo común. También puede anularlo, p. en @PostConstruct.

Por cierto me gustó mucho característica parent en XML, que permitió mantener las alubias secas, pero el enfoque de Java parece aún más limpio.

+3

saluda ejemplo no funcionará si 'frijol base' se definen en XML, con o sin la creación artificial de clase' Bean' y '' Wallace' y Gromit 'será creado por componente-scan. –

0

encontré con la misma construcción .. (una clase padre abstracta general que utiliza Frijoles - con context.xml-declaración para una posible implementación que fue inyectada por el Componente-scan)

Esto es lo que podría tener hacer en la clase @Component:

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

..what que terminé haciendo (mejor, ya que deja claro que la inyección funciona en el objeto no en clases) - y si son capaces de modificar la clase principal:

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

..leave los frijoles reales, así como de su inyección hasta la implementación real (la clase @Component):

@Autowired 
private BeanUsedInParent beanUsedInParent; 

@Override 
public BeanUsedInParent getBeanUsedInParent() { 
    return this.beanUsedInParent; 
} 
Cuestiones relacionadas