la inyección de bienes derivados de haba @Repository sin @Autowired en superclase
Pregunta
Me gustaría utilizar la anotación de la primavera @Repository para evitar la adición de frijol en context.xml. Yo uso ibatis integración, por lo que mi aspecto de clase repositorio como este
@Repository("userDao")
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao {
// ...
}
SqlMapClientDaoSupport (clase biblioteca 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);
}
}
bean SqlMapClient se define en context.xml primavera. Si frijol UserDAO se define en XML que trabaja muy bien, pero cuando pongo anotación y frijol quitar @Repository declaración me da 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 se ve feo
¿Hay alguna otra manera yo inyecte la propiedad sin haber definido?
Solución
¿Qué hay de la introducción de una superclase intermediario?
public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport {
@Autowired
injectSqlMapClient(SqlMapClient sqlMapClient) {
setSqlMapClient(sqlMapClient);
}
}
y
@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 usted está desesperado por evitar el gancho de inyección en la propia clase DAO, no puedo pensar en una mejor manera.