我有以下界面:
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();
}现在,在我在注释中指定的面向对象类中,我希望从接口concert.Performance (execution(* concert.Performance.perform(..)))为perform()方法应用方面,并且我明确地将方面的应用限制在名为"woodstock“(&& bean('woodstock'))的bean上。
但是当我运行它时,我发现这个方面没有应用于woodstock bean,尽管这个bean正在使用(它打印Woodstock.perform())。
如果我没有使用bean(),而是使用了!bean(),那么它就能工作,因此它似乎不能将该bean视为名为"woodstock“的bean。
上面的代码有什么问题吗?
发布于 2017-03-17 01:13:14
特殊的Spring bean()切入点像bean(myBean)或bean(*Bean)一样工作,根据春季AOP文档没有内联单引号或双引号(在本章中向下滚动一点)。
https://stackoverflow.com/questions/42836171
复制相似问题