2017-02-04 54 views
0

我有一个类BigManPlay实现一个接口Performance切入点“或”在Spring AOP组合物

@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()方法和每个方法(装置perform2())在Performance接口是建议的目标。所以我写了以下方面类:

@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!!!"); 
    } 
} 

然后一个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+)没有生效,为什么呢?

回答

0

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

每个Pointcut0 || Pointcut1连接点挑出由任一Pointcut0Pointcut1

这将看起来像

@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创建一个有效的切入点。