如何将方面限制为使用名称指定的 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(在本章中向下滚动一点)。
我有以下界面:
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')
).
但是当我 运行 它时,我看到该方面没有应用到 woodstock bean,尽管那个 bean 是被使用的(它打印 Woodstock.perform()
)
如果我使用 !bean()
而不是 bean()
那么它确实有效,所以它似乎不能将该 bean 视为名为 "woodstock".
上面的代码有问题吗?
特殊的 Spring AOP bean()
切入点像 bean(myBean)
或 bean(*Bean)
一样工作,根据 Spring AOP documentation(在本章中向下滚动一点)。