首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring AOP中的Pointcut "or“组合

Spring AOP中的Pointcut "or“组合
EN

Stack Overflow用户
提问于 2017-02-04 22:56:52
回答 1查看 236关注 0票数 0

我有一个实现Performance接口的类BigManPlay

代码语言:javascript
复制
@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类:

代码语言:javascript
复制
@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配置类:

代码语言:javascript
复制
@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages = {"Chapter_4_2_1.concert"})
public class ConcertConfig {
    @Bean
    public Audience audience() {
        return new Audience();
    }
}

然后是UT类:

代码语言:javascript
复制
@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()输出

代码语言:javascript
复制
Performing 222!

within(Chapter_4_2_1.concert.Performance+)没有生效,为什么?

EN

回答 1

Stack Overflow用户

发布于 2017-02-05 03:15:38

The syntax for pointcut composition for "or" is ||

Pointcut0 || Pointcut1 Pointcut0Pointcut1选择的每个连接点

这将看起来像

代码语言:javascript
复制
@Pointcut("execution(* Chapter_4_2_1.concert.Performance.perform(..)) || within(Chapter_4_2_1.concert.Performance+)")

从本质上讲,解析器找到第一个切入点表达式execution,并停止解析,因为在剩余的表达式中没有其他组合标记。你可以写任何东西

代码语言:javascript
复制
@Pointcut("execution(* Chapter_4_2_1.concert.Performance.perform(..)) blabla")

而且它不会失败的解析。它将为该execution创建一个有效切入点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42041770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档