版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/MASORL/article/details/82558457
接口:CompactDisc
package com.masorl.soundsystem;
public interface CompactDisc {
void play(int i);
}
接口实现:
package com.masorl.soundsystem;
public class BlankDisc implements CompactDisc{
public void play(int i) {
}
}
切面类:用于play()切点的通知
getplayCount: 根据传入的参数,来获取播放次数
通过args(trackNumber) 将参数传入到切面中。
package com.masorl.soundsystem;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import java.util.HashMap;
import java.util.Map;
@Aspect
public class TrackCounter {
private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>();
@Pointcut("execution(* com.masorl.soundsystem.CompactDisc.play(int)) && args(trackNumber)")
public void trackPlayed(int trackNumber){}
@Before("trackPlayed(trackNumber)")
public void countTrack(int trackNumber){
int currentCount = getPlayCount(trackNumber);
trackCounts.put(trackNumber, currentCount+1);
}
public int getPlayCount(int trackNumber){
return trackCounts.containsKey(trouble)? trackCounts.get(trackNumber): 0;
}
}
配置类,将切面类和CompactDisc加入到Spring bean中
package com.masorl.soundsystem;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@EnableAspectJAutoProxy
public class JavaConfig {
@Bean
public CompactDisc compactDisc(){
return new BlankDisc();
}
@Bean
public TrackCounter trackCounter(){
return new TrackCounter();
}
}
此时,Spring容器中,有个一个BlanDisc bean,和一个切面bean,当调用play方法时,或触发切面的通知。
测试方法如下
import com.masorl.soundsystem.CompactDisc;
import com.masorl.soundsystem.JavaConfig;
import com.masorl.soundsystem.TrackCounter;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.assertEquals;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = JavaConfig.class)
public class test {
// @Autowired
// AsceotDemo asceotDemo;
@Autowired
CompactDisc compactDisc;
@Autowired
TrackCounter trackCounter;
@Test
public void test(){
compactDisc.play(1);
compactDisc.play(1);
compactDisc.play(3);
compactDisc.play(3);
compactDisc.play(3);
compactDisc.play(3);
compactDisc.play(7);
compactDisc.play(8);
assertEquals(2, trackCounter.getPlayCount(1));//1 一共执行了2次,所以对应的次数应该为2
assertEquals(0, trackCounter.getPlayCount(2));
assertEquals(4, trackCounter.getPlayCount(3));
assertEquals(0, trackCounter.getPlayCount(4));
assertEquals(0, trackCounter.getPlayCount(5));
assertEquals(0, trackCounter.getPlayCount(6));
assertEquals(1, trackCounter.getPlayCount(7));
assertEquals(1, trackCounter.getPlayCount(8));
}
}
assertEquals 断言来判断播放次数,如果不匹配,就会抛出java.lang.AssertionError:。