2016-09-30 5 views
1

Ich bin neu bei ByteBuddy und habe einfache Frage. Gibt es eine Möglichkeit, Interzeptoren zusammenzufassen, zB via Annotation? Etwas wie:Gibt es einen Weg zu Composite-Interzeptoren

@Logging 
@Transactional 
public void foo() {} 

Möchten Logging Interceptor hinzufügen und sicherstellen, dass es transaktional ist?

Antwort

0

Dank Rafael Winterhalter und Diskussion, die ich seine vorgeschlagene Antwort bin Entsendung:

Sie müssten Ihr eigenes Generikum Dispatcher schreiben. Ich würde vorschlagen, dass Sie eine Form von generischem Dispatcher erstellen, der dann programmgesteuert delegiert.
Zum Beispiel: isAnnotatedWith(anyOf(dispatcher.getAnnotationTypes()) wo der Dispatcher dann zu den betreffenden Komponenten routet.

0

Natürlich, wenn Sie eine ByteBuddy instanace verwenden, ist es auf die verwendete ElementMatcher verwendet wurden:

annotatedWith(Logging.class).or(annotatedWith(Transactional.class)) 

Wenn Sie eine AgentBuilder verwenden, würden Sie eine Instrumentierung für jeden Typ definieren, wo man verschiedene kombinieren Typ Matcher

.type(declaresMethod(annotatedWith(Logging.class)))  
    .transform(new LoggingTranformer()) 
    .asDecorator() 
.type(declaresMethod(annotatedWith(Transactional.class))) 
    .transform(new TransactionalTranformer()) 
    .asDecorator() 

verwenden des asDecorator() Befehl, die beiden Transformatoren sind verkettet.

+0

Danke Rafael für Ihre Antwort! Ist dieser .asDecorator() Ansatz nur mit Bytebuddy möglich? Ich möchte am Ende mehrere Interzeptoren haben, aber jede Lösung zu einer Klasse trennen, da die Anzahl der Kombinationen ziemlich groß sein kann. –

+0

Was meinst du mit "nur mit Byte Buddy möglich"? –

+0

Sorry, mir fehlt eindeutig etwas. Ich habe verstanden, dass ByteBuddy-Instanz und AgentBuilder zwei verschiedene Ansätze sind. Muss ich AgentBuilder verwenden, um diesen Verkettungsansatz zu haben? Ich habe mich gefragt, ob ich diese Kette mit .intercept() erreichen kann. Wie: neues ByteBuddy (..) .with (...). Implementieren (type) Methode (annotierteWith (Logging.class) .oder (annotierteWith (Transactional.class))). Abfangen (WHAT_PUT_HERE ??) Wo, wenn Logging und Transactional präsentiert wird, wird es beide Interzeptoren kombinieren. Wenn es nur Logging geben wird, hat nur ein Interceptor –

Verwandte Themen