2010-09-27 4 views
6

Ich möchte @Repository spring Annotation verwenden, um das Hinzufügen von Bean in context.xml zu vermeiden. Ich benutze ibatis Integration, so dass meine Repository-Klasse sieht wie folgt ausInjizieren der abgeleiteten Eigenschaft für @Repository-Bean ohne @Autowired in der Superklasse

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

SqlMapClientDaoSupport (Federbibliotheksklasse) hat letzte Methode für erforderlich Eigenschaft festlegen, die nicht mit @Autowired kommentierten oder @Resourse

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

SqlMapClient Bean ist in Spring context.xml definiert. Wenn userDao Bean in XML definiert ist, es funktioniert gut, aber wenn ich @Repository Annotation setzen und Bohnen Erklärung entferne ich erhalte die folgende Ausnahme

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

Eine Abhilfe neue Methode wie

sein kann
@Aitowired 
injectSqlMapClient(SqlMapClient sqlMapClient) { 
    setSqlMapClient(sqlMapClient); 
} 
hinzufügen

aber es sieht hässlich aus

Gibt es einen anderen Weg yo die Eigenschaft injizieren, ohne definiert zu haben?

+1

Ich denke, Ihre Workaround ist eine ziemlich anständige. – Bozho

Antwort

3

Wie wäre es mit einer vermittelnden Superklasse?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport { 

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

und dann

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

Ja, es ist Missbrauch der Vererbung, aber auch nicht schlechter als die bestehenden SqlMapClientDaoSupport, und wenn Sie verzweifelt sind die Injektion Haken in der DAO-Klasse selbst zu vermeiden, kann ich Ich denke nicht an einen besseren Weg.

+0

Ich habe auch über eine solche Klasse nachgedacht (ich habe mehr als ein DAO, also ist es definitiv besser als diesen injectSqlMapClient in jedem DAO), aber es sieht für mich hässlich aus, weil ich eine neue Klasse einführen muss, die ich wirklich nicht brauche - Ich entferne eine Sache (Bean-Definitionen), aber bekomme stattdessen eine andere (neue Klasse). Aber trotzdem, danke für deine Gedanken –

Verwandte Themen