我有以下界面:
public interface Performance {
public void perform();
}
由以下类实现:
@Component
public class Woodstock implements Performance {
public void perform() {
System.out.println("Woodstock.perform()");
}
}
我想申请的方面就是这个:
@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");
}
}
}
程序的配置文件声明了以下bean:
@Bean
public Audience audience(){
return new Audience();
}
@Bean
public Performance woodstock(){
return new Woodstock();
}
我正在进行的测试就是:
@Autowired
ApplicationContext context;
@Autowired
@Qualifier("woodstock")
Performance performance;
@Test
public void test(){
printBeanNames();
performance.perform();
}
现在,在我在注释中指定的Audience类中,我想从接口concert.Performance(execution(* concert.Performance.perform(..))
)应用perform()方法的方面,并且我明确地限制了方面的应用到名为“woodstock”(&& bean('woodstock')
)的bean。
但是当我运行它时,我发现该方面不适用于woodstock bean,尽管那个bean是正在使用的那个(它打印Woodstock.perform()
)
如果不是bean()
我使用!bean()
那么它确实有用,所以它似乎不能将那个bean视为名为“woodstock”的那个。
上面的代码有什么问题吗?
答案 0 :(得分:1)
特殊的Spring AOP bean()
切入点就像bean(myBean)
或bean(*Bean)
一样,根据Spring AOP documentation,bean名称周围没有内联单引号或双引号(向下滚动)本章中的一点点。)