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

How to limit an aspect to a bean specified with a name?

我有以下界面:

public interface Performance {
    public void perform();
}

由以下class实现:

@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 class 中,我在注释中指定我想从接口 concert.Performance (execution(* concert.Performance.perform(..))) 应用 perform() 方法的方面,并且我我明确地将方面的应用限制为名称为 "woodstock" (&& bean('woodstock')).

的 bean

但是当我 运行 它时,我看到该方面没有应用到 woodstock bean,尽管那个 bean 是被使用的(它打印 Woodstock.perform()

如果我使用 !bean() 而不是 bean() 那么它确实有效,所以它似乎不能将该 bean 视为名为 "woodstock".

的 bean

上面的代码有问题吗?

特殊的 Spring AOP bean() 切入点像 bean(myBean)bean(*Bean) 一样工作,根据 Spring AOP documentation(在本章中向下滚动一点)。