2009-06-18 41 views
5

Resolución: No, ya no extiendo el padre original.¿Puedo anotar una propiedad final heredada con @Autowire?

Original:
¿Hay alguna forma de anotar un método heredado final setter? Estoy extendiendo una clase que tiene un setter final que me gustaría @Autowire con Spring. La clase principal es de una biblioteca y no se puede modificar.

Una solución alternativa que he encontrado es escribir un método proxy, pero esto parece más trabajo de lo necesario.

public abstract class SqlMapClientDaoSupport ... { 
    public final void setSqlMapClient(SqlMapClient smc) { 
     ... 
    } 
} 

@Component 
public class AccountDao extends SqlMapClientDaoSupport { 
    // all this just to annotate an existing method? 
    @Autowire 
    public final void setSqlMapClientWorkaround(SqlMapClient smc) { 
     super.setSqlMapClient(smc); 
    } 
} 

Editar 1: Por encima de ejemplo modificado para reflejar caso de uso:
El caso de uso está implementando DAO objetos para Ibatis/Primavera que se extienden una común base class. Cada DAO necesita el mismo conjunto de propiedades , y cada uno debe configurarse como un bean. Actualmente, hago esto configurando cada uno individualmente en applicationContext.xml.

<bean id="accountDAO" 
    class="com.example.proj.dao.h2.AccountDAOImpl" 
    p:sqlMapClient-ref="sqlMapClient" /> 
<bean id="companyDAO" 
    class="com.example.proj.dao.h2.CompanyDAOImpl" 
    p:sqlMapClient-ref="sqlMapClient" /> 
<!-- etc... --> 

yo preferiría utilizar el componente de exploración para descubrir y Autowire la DAO objetos automáticamente, lo que no puedo copiar/pegar chapuza.

<context:component-scan base-package="com.example.proj.dao.h2" /> 

no veo en el annotation guide cómo se podría anotar un propiedad/miembro distinto de donde declarada. Espero que sea algo que me falta.

Edición 2: yo ya no estoy extendiendo la clase SqlMapClientDaoSupport, en lugar de mi AccountDao es un POJO que implementa la poca funcionalidad estaba siendo proporcionado por la clase de apoyo. Esto me permite usar @Autowire a voluntad.

+0

¿Qué sucede cuando lo intentas? – skaffman

+0

¿Cuál sería la sintaxis para anotar un método en una superclase, sin redeclarlo en la subclase? – Chadwick

Respuesta

0

no, no hay manera de anotar un último método heredado.

En lugar de extender la clase de soporte (SqlMapClientDaoSupport), lo reimplecé en mi proyecto (su comportamiento es mínimo) anotando los métodos según sea necesario, y mi DAO amplía esa clase de soporte.

2

¿Has intentado configurarlo con xml? Debido a que es una clase existente que parece que no puede cambiar, es un candidato definitivo para configurarlo con xml. A continuación, puede especificar como Autowire", o incluso configurar la propiedad en el xml.

+0

Sí, puedo configurar MyClass en applicationConfig.xml. El deseo de utilizar @Autowire se debe a que varias clases en el mismo paquete cada necesitan el mismo conjunto de propiedades. He actualizado la pregunta original – Chadwick

+1

Puedes ver usando una definición de bean "abstracta". Al menos entonces no tendrá que declarar la propiedad en cada bean, todo lo que tendrá que hacer es hacer referencia a ese bean abstracto como un bean padre. El problema con el uso del enfoque de anotación es que necesita acceder al código fuente. –

+0

+1 para la solución en comentarios. – Chadwick

0

Me suena como usted no debería estar tratando de establecer un campo final.

Por lo general hay una buena razón por la cual campos son finales.

que tiene un objeto de configuración SqlMapClientFactoryBean?

Ver here for help

+0

El campo es definitivo, no para evitar establecerlo, pero para evitar anular su comportamiento. Es mi SqlMapClientFactoryBean que estaba intentando que Spring pasara usando @Autowired. – Chadwick

0

Puedes crear un nuevo constructor con params para todos los setters que sean finales y @Autowired el constructor, luego llamar a los setters en el constructor.

Cuestiones relacionadas