如何将方面限制为使用名称指定的bean?

时间:2017-03-16 13:57:58

标签: spring aop aspectj

我有以下界面:

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”的那个。

上面的代码有什么问题吗?

1 个答案:

答案 0 :(得分:1)

特殊的Spring AOP bean()切入点就像bean(myBean)bean(*Bean)一样,根据Spring AOP documentation,bean名称周围没有内联单引号或双引号(向下滚动)本章中的一点点。)