我有一个实现Performance接口的类BigManPlay
@Component
public class BigManPlay implements Performance {
@Override
public void perform() {
System.out.println("Performing 111!");
}
@Override
public void perform2() {
System.out.println("Performing 222!");
}
}然后,我希望perform()方法和Performance接口中的每个方法(即perform2())都是建议目标。所以我写了下面的aspect类:
@Aspect
public class Audience {
@Pointcut("execution(* Chapter_4_2_1.concert.Performance.perform(..)) or within(Chapter_4_2_1.concert.Performance+)")
public void performance() {}
@Before("performance()")
public void silenceCellPhones() {
System.out.println("Silencing cell phones");
}
@Before("performance()")
public void takeSeats() {
System.out.println("Taking seats");
}
@AfterReturning("performance()")
public void applause() {
System.out.println("CLAP CLAP CLAP!!!");
}
}然后是连接bean的java配置类:
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"Chapter_4_2_1.concert"})
public class ConcertConfig {
@Bean
public Audience audience() {
return new Audience();
}
}然后是UT类:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=ConcertConfig.class)
public class PerformanceTest {
@Autowired
Performance bigManPlay;
@Rule
public final SystemOutRule log = new SystemOutRule().enableLog();
@Test
public void testWithPerformance() {
log.clearLog();
bigManPlay.perform();
assertEquals("Silencing cell phones" + System.lineSeparator()
+ "Taking seats" + System.lineSeparator()
+ "Performing 111!" + System.lineSeparator()
+ "CLAP CLAP CLAP!!!" + System.lineSeparator(), log.getLog());
}
@Test
public void testWithPerformance2() {
log.clearLog();
bigManPlay.perform2();
assertEquals("Silencing cell phones" + System.lineSeparator()
+ "Taking seats" + System.lineSeparator()
+ "Performing 222!" + System.lineSeparator()
+ "CLAP CLAP CLAP!!!" + System.lineSeparator(), log.getLog());
}
}UT失败。仅testWithPerformance2()输出
Performing 222!within(Chapter_4_2_1.concert.Performance+)没有生效,为什么?
发布于 2017-02-05 03:15:38
The syntax for pointcut composition for "or" is ||。
Pointcut0 || Pointcut1Pointcut0或Pointcut1选择的每个连接点
这将看起来像
@Pointcut("execution(* Chapter_4_2_1.concert.Performance.perform(..)) || within(Chapter_4_2_1.concert.Performance+)")从本质上讲,解析器找到第一个切入点表达式execution,并停止解析,因为在剩余的表达式中没有其他组合标记。你可以写任何东西
@Pointcut("execution(* Chapter_4_2_1.concert.Performance.perform(..)) blabla")而且它不会失败的解析。它将为该execution创建一个有效切入点。
https://stackoverflow.com/questions/42041770
复制相似问题