6 Stimmen

Injizieren einer abgeleiteten Eigenschaft für eine @Repository-Bean ohne @Autowired in der Superklasse

Ich möchte die Spring-Annotation @Repository verwenden, um das Hinzufügen von Beans in context.xml zu vermeiden. Ich verwende die ibatis-Integration, daher sieht meine Repository-Klasse wie folgt aus

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

SqlMapClientDaoSupport (Spring-Bibliotheksklasse) hat eine finale Methode zum Einstellen der erforderlichen Eigenschaft, die nicht mit @Autowired oder @Resourse annotiert ist

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, funktioniert es gut, aber wenn ich @Repository Annotation setzen und entfernen Bean-Deklaration erhalte ich die folgende Ausnahme

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

Eine Abhilfe kann darin bestehen, eine neue Methode wie

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

aber es sieht hässlich aus

Gibt es eine andere Möglichkeit, yo injizieren die Eigenschaft ohne definiert?

1 Stimmen

Ich denke, Ihr Lösungsansatz ist ziemlich gut.

3voto

skaffman Punkte 389758

Wie wäre es mit der Einführung einer zwischengeschalteten Oberklasse?

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 ein Missbrauch des Erbes, aber nicht schlimmer als die bestehenden SqlMapClientDaoSupport und wenn Sie unbedingt den Injektionshaken in der DAO-Klasse selbst vermeiden wollen, fällt mir kein besserer Weg ein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X