2017-03-16 1 views
0

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?

Antwort

1

Der spezielle Frühling AOP bean() Pointcut wie bean(myBean) oder bean(*Bean) arbeitet, gibt es keine Inline einfache oder doppelte Anführungszeichen um die Bohne Namen nach den Spring AOP documentation (scrollen ein wenig in diesem Kapitel nach unten).

Verwandte Themen