2009-06-18 5 views
5

Auflösung: Nein, ich verlängere nicht mehr das ursprüngliche Elternteil.Kann ich eine vererbte endgültige Eigenschaft mit @Autowire annotieren?

Original:
Gibt es eine Möglichkeit, eine geerbte final Setter-Methode zu kommentieren? Ich erweitere eine Klasse, die einen final Setter hat, den ich gerne mit @Autowire mit Spring. Die Elternklasse stammt aus einer Bibliothek und kann nicht geändert werden.

Ein Workaround, den ich gefunden habe, ist eine Proxy-Methode schreiben, aber das scheint mehr Arbeit als nötig.

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); 
    } 
} 

Edit 1: Obiges Beispiel modifiziert Anwendungsfall zu reflektieren:
Der Anwendungsfall ist DAO Implementierung Objekte für Ibatis/Frühjahr welche sich eine gemeinsame base class. Jedes DAO benötigt denselben Eigenschaftssatz , und jeder muss als Bean konfiguriert werden. Ich derzeit tun dies durch Konfigurieren jedes einzeln in 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... --> 

ich lieber Komponente Scan verwenden, um die DAO Objekte automatisch zu entdecken und autowire, die ich nicht kopieren/einfügen Murks.

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

sehe ich nicht in den annotation guide, wie man ein Eigenschaft/Mitglied mit Anmerkungen versehen würde anders als in dem erklärt. Ich hoffe, das ist etwas, das ich vermisse.

Edit 2: Ich bin nicht mehr die SqlMapClientDaoSupport-Klasse erweitern, anstatt meine AccountDao ist ein POJO, die implementiert, was wenig Funktionalität wurde von der Support-Klasse bereitgestellt wird. Dies erlaubt mir, @Autowire nach Belieben zu verwenden.

+0

Was passiert, wenn Sie es versuchen? – skaffman

+0

Was wäre die Syntax, um eine Methode für eine Oberklasse zu kommentieren, ohne sie in der Unterklasse neu zu deklarieren? – Chadwick

Antwort

0

Nein, es gibt keine Möglichkeit eine vererbte letzte Methode zu annotieren.

Anstatt die Support-Klasse (SqlMapClientDaoSupport) zu erweitern, implementierte ich es in meinem Projekt (es ist das Verhalten ist minimal) kommentieren die Methoden wie benötigt, und meine DAO erweitern diese Support-Klasse.

2

Haben Sie versucht, es mit XML zu konfigurieren? Da es sich um eine vorhandene Klasse handelt, die aussieht, als ob sie nicht geändert werden kann, ist sie definitiv ein Kandidat für die Konfiguration mit xml. Dann können Sie es als autowire angeben“, oder auch die Eigenschaft, in der XML-Konfiguration.

+0

Ja, ich kann MyClass in der applicationConfig.xml konfigurieren. Der Wunsch @Autowire zu verwenden ist, weil mehrere Klassen im selben Paket jeweils die gleiche Eigenschaft benötigen. Ich habe die ursprüngliche Frage aktualisiert – Chadwick

+1

Sie könnten mit einer "abstrakten" Bean-Definition aussehen. Zumindest dann müssen Sie die Eigenschaft nicht in jeder Bean deklarieren, Sie müssen lediglich diese abstrakte Bean als eine übergeordnete Bean referenzieren. Problem bei der Verwendung des Annotationsansatzes ist, dass Sie Zugriff auf den Quellcode benötigen. –

+0

+1 für die Lösung in Kommentaren. – Chadwick

0

Es klingt für mich wie sollten Sie keine endgültige Feld zu setzen versuchen.

Es ist in der Regel ein guter Grund, warum Felder sind endgültig.

Sie Setup-Objekt eine SqlMapClientFactoryBean haben?

Siehe here for help

+0

Das Feld ist endgültig, um die Einstellung nicht zu verhindern, aber um ein Überschreiben des Verhaltens zu verhindern. Es ist meine SqlMapClientFactoryBean, die ich versuchte, Spring mit @Autowired zu übergeben. – Chadwick

0

Sie könnten einen neuen Konstruktor mit Parametern für alle Setter erstellen, die final sind, und @Autowired den Konstruktor, dann rufen Sie die Setter im Konstruktor auf.