Ich habe die folgende Schnittstelle:Wie kann ein Aspekt auf eine Bean beschränkt werden, die mit einem Namen angegeben ist?
public interface Performance {
public void perform();
}
durch die folgende Klasse implementiert:
@Component
public class Woodstock implements Performance {
public void perform() {
System.out.println("Woodstock.perform()");
}
}
Der Aspekt, den ich anwenden will, ist diese:
@Aspect
public class Audience {
@Pointcut("execution(* concert.Performance.perform(..)) "
+ "&& bean('woodstock')"
)
public void performance() {}
@Around("performance()")
public void watchPerformance(ProceedingJoinPoint jp) {
try {
System.out.println("Taking seats");
jp.proceed();
System.out.println("CLAP CLAP CLAP!!!");
} catch (Throwable e) {
System.out.println("Demanding a refund");
}
}
}
Die Konfigurationsdatei für die Programm deklariert die folgenden Beans:
@Bean
public Audience audience(){
return new Audience();
}
@Bean
public Performance woodstock(){
return new Woodstock();
}
Und der Test, den ich laufen werde, ist dies:
@Autowired
ApplicationContext context;
@Autowired
@Qualifier("woodstock")
Performance performance;
@Test
public void test(){
printBeanNames();
performance.perform();
}
Jetzt, in der Zielgruppe der Klasse I in der Anmerkung angegeben, dass ich den Aspekt für die durch() -Methode von der Schnittstelle Konzert anwenden möchten. Leistung (execution(* concert.Performance.perform(..))
) und ich beschränke explizit die Anwendung des Aspekts auf die Bohne, deren Name "Woodstock" ist (&& bean('woodstock')
).
Aber wenn ich es laufen sehe ich, dass der Aspekt nicht auf die Woodstock-Bean angelegt wird, obwohl die Bohne derjenige verwendet wird (es druckt Woodstock.perform()
)
Wenn statt bean()
ich !bean()
verwenden dann funktioniert es , so scheint es, dass es diese Bohne nicht als die "Woodstock" genannte Bohne betrachten kann.
Gibt es etwas Falsches im obigen Code?