2010-09-27 15 views
6

Me gustaría utilizar @Repository spring anotation para evitar agregar bean en context.xml. utilizo la integración ibatis, por lo que mi clase repositorio se parece a estoinyectando propiedad derivada para @Repository bean sin @Autowired en super clase

@Repository("userDao") 
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

SqlMapClientDaoSupport (clase biblioteca de primavera) tiene método final para el establecimiento de la propiedad requerida que no está anotado con @Autowired o @Resourse

public final void setSqlMapClient(SqlMapClient sqlMapClient) { 
    if (!this.externalTemplate) { 
     this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient); 
    } 
} 

El bean SqlMapClient se define en spring context.xml. Si frijol UserDAO se define en XML que trabaja muy bien, pero cuando pongo anotación @Repository y retirar la declaración de frijol tengo la siguiente excepción

java.lang.IllegalArgumentException: Property 'sqlMapClient' is required 

Una solución puede consistir en añadir nuevo método como

@Aitowired 
injectSqlMapClient(SqlMapClient sqlMapClient) { 
    setSqlMapClient(sqlMapClient); 
} 

pero parece feo

¿Hay alguna otra forma de inyectar la propiedad sin haberla definido?

+1

Creo que su solución es bastante acertada. – Bozho

Respuesta

3

¿Qué le parece introducir una superclase intermediaria?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport { 

    @Autowired 
    injectSqlMapClient(SqlMapClient sqlMapClient) { 
     setSqlMapClient(sqlMapClient); 
    } 
} 

y luego

@Repository("userDao") 
public class UserDaoMybatis extends AutoringSqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

Sí, es el abuso de la herencia, pero no es peor que la SqlMapClientDaoSupport existente, y si estás desesperado para evitar el gancho de inyección en la propia clase DAO, puedo No pienses en una mejor manera.

+0

También pensé en tener una clase de este tipo (tengo más de un DAO, por lo que definitivamente es mejor que tener esto injectSqlMapClient en cada DAO), pero me parece feo porque necesito presentar una nueva clase que realmente no necesito - Elimino una cosa (definiciones de bean) pero obtengo otra (nueva clase). Pero de todos modos, gracias por tus pensamientos –

Cuestiones relacionadas