2011-01-06 9 views
8

hay una manera de reemplazar constructor-arg con anotación?reemplazar <constructor-arg> con la anotación de resorte

tengo este constructor:

public GenericDAOImpl(Class<T> type) { 
    this.type = type; 
} 

y necesito para inyectar que en mi Fachada:

@Inject 
private GenericDAO<Auto, Long> autoDao; 

El problema es que no sé cómo pasar el valor del parámetro en costructor

gracias de antemano

[Más información] intento explicar mi problema.

<bean id="personDao" class="genericdao.impl.GenericDaoHibernateImpl"> 
     <constructor-arg> 
      <value>genericdaotest.domain.Person</value> 
     </constructor-arg> 
</bean> 

Quiero convertir ese código usando solo una anotación. ¿Alguien puede explicar cómo?

Respuesta

2

Actualización: Me temo que no es posible hacer lo que está intentando. No puede obtener argumentos de constructor a partir de los parámetros del punto de inyección. Un FactoryBean sería el primer lugar para buscar, pero no tiene los metadatos del punto de inyección. (Es de notar: este caso es fácilmente cubierto por CDI)

Respuesta original: (que todavía puede funcionar si configura los tipos externamente)

Utilice simplemente @Inject en el constructor. Pero tenga en cuenta que la primavera frunce el ceño ante la inyección del constructor. Considere la inyección de setter/campo.

En su caso, sin embargo, es probable que tenga más de un grano del tipo Class. Si este es el caso, puede usar @Resource(name="beanName").

A partir de los documentos de javax.inject.Inject:

constructores inyectables se anotan con @Inject y aceptan cero o más dependencias como argumentos. @Inject puede aplicarse a un constructor por clase como máximo.

@Inject ConstructorModifiersopt SimpleTypeName(FormalParameterListopt) 
    Throwsopt ConstructorBody 
+0

Ya uso @Inject, pero necesito pasar el tipo de clase también. ¿Hay una manera de hacerlo? o debo usar el enfoque xml? –

+0

¿cuál es ese valor? ¿De dónde lo sacas? – Bozho

+0

@Inject private GenericDAO autoDao; cuando GenericDAO estaba disponible, necesito pasar el valor del tipo Clase

4

creo @Inject por sí sola no va a ayudar, tendrá que utilizar una anotación @Qualifier también.

Aquí está la sección correspondiente de la primavera de referencia:
3.9.3 Fine-tuning annotation-based autowiring with qualifiers

Si entiendo esto correctamente, tendrá que utilizar el mecanismo de @Qualifier.

Si utiliza Spring's @Qualifier annotation, es probable que pueda hacerlo en línea, algo como esto:

@Repository 
public class DaoImpl implements Dao{ 

    private final Class<?> type; 

    public DaoImpl(@Qualifier("type") final Class<?> type){ 
     this.type = type; 
    } 

} 

Pero si se utiliza el JSR-330 @Qualifier annotation, supongo que tendrá que crear su propia anotación personalizada que está marcado con @Qualifier .


Otra posibilidad sería la @Value anotación. Con él puedes usar Expression Language, p. de esta manera:

public DaoImpl(
    @Value("#{ systemProperties['dao.type'] }") 
    final Class<?> type){ 
    this.type = type; 
} 
2

Una opción para tener el tipo en su constructor es:

public abstract class GenericDAO<T> { 
    private Class<T> persistentClass; 

    public GenericDAO() { 
     this.persistentClass = (Class<T>) ((ParameterizedType) getClass() 
      .getGenericSuperclass()).getActualTypeArguments()[0]; 
    } 
... 
} 

pero deben tener diferentes implementaciones específicas para cada T.

ventaja es que no es necesario pasar el tipo T como un parámetro.

0

La primavera Java Configuration podría ser de ayuda aquí. Si crea una clase Java que simplemente define sus granos utilizando las anotaciones @Configuration y @Bean que podría ser algo como esto:

@Configuration 
public class DaoConfiguration { 
    @Bean 
    public GenericDAO<Person> personDao() { 
     return new GenericDaoHibernateImpl(Person.class); 
    } 
} 

Asegúrese de que la clase DaoConfiguration se escanea (normalmente a través de @ComponentScan) y un DAO-objeto propio se creará para ti en el contexto de primavera. El grano tendrá el nombre del método que en este caso es personDao por lo que puede inyectarlo por su nombre utilizando el nombre personDao o por tipo si el tipo es GenericDAO<Person>.

Cuestiones relacionadas