面向切面的Spring
1、实现类:BlankDisc
package Chapter_04;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component("Blank")
public class BlankDisc {
private String title = "default";
private String artist = "ymc";
private List<String> tracks = new ArrayList<String>();
public BlankDisc() {
tracks.add("song 1");
tracks.add("song 2");
tracks.add("song 3");
tracks.add("song 4");
tracks.add("song 5");
tracks.add("song 6");
tracks.add("song 7");
tracks.add("song 8");
tracks.add("song 9");
tracks.add("song 10");
tracks.add("song 11");
tracks.add("song 12");
}
public void playTrack(int i)
{
String aa = tracks.get(i);
System.out.println("【BlankDisc 】>>>>>>>>>>>>>>>>>Playing "+title+" by "+artist+"track:"+aa);
}
}
2、实现类:TrackCounter,利用切面完成对不同number的track播放次数的统计
package Chapter_04;
import java.util.Map;
import java.util.HashMap;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class TrackCounter {
private Map<Integer,Integer> trackCounts = new HashMap<Integer,Integer>();
@Pointcut(
"execution(* Chapter_04.BlankDisc.playTrack(int)) "+
"&& args(trackNumber1)")
public void trackPlayed(int trackNumber1){}
@Before("trackPlayed(trackNumber1)")
public void countTrack(int trackNumber1){
int currentCount = getPlayCount(trackNumber1);
trackCounts.put(trackNumber1,currentCount+1);
}
public int getPlayCount(int trackNumber)
{
return trackCounts.containsKey(trackNumber)?trackCounts.get(trackNumber):0;
}
}
3、配置类:
package Chapter_04;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@EnableAspectJAutoProxy
public class TrackCounterConfig {
@Bean
public BlankDisc getBlankDisc()
{
BlankDisc cd = new BlankDisc();
return cd;
}
@Bean
public TrackCounter trackCounter()
{
return new TrackCounter();
}
}
4、测试类,调用playTrack方法,来通知切面对播放进行计数,最后打印number为2的track的播放次数:
package Chapter_04;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TrackCounterConfig.class)
public class TrackCounterTest {
@Autowired
private BlankDisc cd;
@Autowired
private TrackCounter counter;
@Test
public void testTrackCounter(){
System.out.println("112333");
cd.playTrack(1);
cd.playTrack(2);
cd.playTrack(2);
cd.playTrack(3);
cd.playTrack(4);
System.out.println("song 2的播放次数:"+counter.getPlayCount(2));
}
}
5、执行结果:
112333
【BlankDisc 】>>>>>>>>>>>>>>>>>Playing default by ymctrack:song 2
【BlankDisc 】>>>>>>>>>>>>>>>>>Playing default by ymctrack:song 3
【BlankDisc 】>>>>>>>>>>>>>>>>>Playing default by ymctrack:song 3
【BlankDisc 】>>>>>>>>>>>>>>>>>Playing default by ymctrack:song 4
【BlankDisc 】>>>>>>>>>>>>>>>>>Playing default by ymctrack:song 5
song 2的播放次数:2