Wir verwenden Spring TransactionInterceptor
einige Datenbankpartitionsinformationen mit ThreadLocal
zu setzen, wenn eine DAO-Methode mit der @Transactional
Annotation markierte ausgeführt wird. Wir benötigen dies, um unsere Abfragen an verschiedene Datenbankpartitionen weiterleiten zu können.Wie kann eine Spring-Bean feststellen, ob sie selbst in einen AOP-Proxy eingebettet wurde?
Dies funktioniert für die meisten DAO-Methoden:
// this causes the invoke method to set a thread-local with the host name of
// the database server the partition is on
@Transactional
public int deleteAll() throws LocalDataException {
Das Problem ist, wenn wir die DAO Proxy Objekt selbst innerhalb des DAO verweisen müssen. Normalerweise müssen wir die Anrufer in dem Proxy-dao passieren müssen:
public Pager<Foo, Long> getPager(FooDao proxyDao) {
Dies sieht aus wie die in folgenden Code, die offensichtlich grob ist.
fooDao.getPager(fooDao);
Das Problem ist, dass, wenn wir innerhalb von FooDao sind, die this
ist nicht der Proxy-DAO, die wir brauchen.
Gibt es einen besseren Mechanismus für eine Bohne zu entdecken, dass es sich um einen Proxy-Wrapper hat? Ich habe an den Spring AOPUtils aussehen, aber ich sehe keine Möglichkeit, den Proxy für ein Objekt zu finden. Ich möchte nicht isAopProxy(...)
zum Beispiel. Ich habe auch gelesen, die Spring AOP docs aber ich kann nicht eine Lösung dort sehen, wenn ich meinen eigenen AOP nativen Code implementieren, die ich hatte gehofft, zu vermeiden.
Ich vermute, dass ich in der Lage sein könnte, die DAO in sich selbst mit einer ApplicationContextAware
-Anwendung Bean und eine setProxyDao(...)
-Methode zu injizieren, aber das scheint wie ein Hack auch. Irgendwelche anderen Ideen, wie ich den Proxy erkennen kann, damit ich ihn innerhalb der Bohne selbst verwenden kann? Danke für jede Hilfe.
Ist native Aspectj Lade/Kompilierzeit Weben überhaupt keine Option - dann wird der Rat in den Proxy weben und Sie sollten keine Frage von Proxy und dieser Referenz innerhalb des Proxy haben? –
'This' wird @ Thorbjørn nicht tun, weil wie die Post Staaten, ich brauche den Proxy _not_ die Bohne selbst. – Gray
Schreiben meiner eigenen AOP kann meine einzige Lösung @Biju sein. Ich hatte gehofft, es zu vermeiden, wenn ich kann. Danke tho. – Gray