本文介绍了详解spring切面使用传递给被通知方法的参数,分享给大家,具体如下:
场景:
BlankDisc代表CD实体,可以通过playTrack()方法直接播放某一个磁道中的歌曲。
需求是记录每个磁道被播放的次数。
一种方法就是修改playTrack()方法,直接在每次调用的时候记录这个数量。但是,记录磁道的播放次数与播放本身是不同的关注点,因此不应该属于playTrack()方法。这应该是切面要完成的任务。
CompactDisc接口
1
2
3
4
5
6
|
public interface CompactDisc { //播放某一个磁道中的歌曲 void playTrack(String track); } |
实现类BlankDisc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class BlankDisc implements CompactDisc { private String title; private String artist; private List<String> tracks; public void setTitle(String title) { this .title = title; } public void setArtist(String artist) { this .artist = artist; } public void setTracks(List<String> tracks) { this .tracks = tracks; } @Override public void playTrack(String track) { System.out.println( "-Track: " + track); } } |
切面类TraceCount
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/** * 切面类的任务:记录每个磁道被播放的次数 * Created by Administrator on 2017/12/1. */ @Component @Aspect public class TrackCounter { private Map<String, Integer> trackCounts = new HashMap<>(); @Pointcut ( "execution(* chapter04.aop_args.BlankDisc.playTrack(String)) && args(track)" ) public void trackPlayed(String track) { } //在播放前,为该磁道计数 @Before ( "trackPlayed(track)" ) public void countTrack(String track) { int currentCount = getPlayCount(track); trackCounts.put(track, currentCount + 1 ); } public int getPlayCount(String track) { return trackCounts.containsKey(track) ? trackCounts.get(track) : 0 ; } } |
applicationContext.xml配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
< context:component-scan base-package = "aop_test,chapter04" /> < bean id = "compactDisc" class = "chapter04.aop_args.BlankDisc" > < property name = "title" value = "Sgt. Pepper's Lonely Hearts Club Band" /> < property name = "artist" value = "The Beatles" /> < property name = "tracks" > < list > < value >Sgt. Pepper's Lonely Hearts Club Band</ value > < value >With a Little Help from My Friends</ value > < value >Lucy in the Sky with Diamonds</ value > < value >Getting Better</ value > < value >Fixing a Hole</ value > < value >She's Leaving Home</ value > < value >Being for the Benefit of Mr. Kite!</ value > < value >Within You Without You</ value > < value >When I'm Sixty-Four</ value > < value >Lovely Rita</ value > < value >Good Morning Good Morning</ value > < value >Sgt. Pepper's Lonely Hearts Club Band (Reprise)</ value > < value >A Day in the Life</ value > </ list > </ property > </ bean > <!-- 开启aop注解 --> < aop:aspectj-autoproxy /> |
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@RunWith (SpringJUnit4ClassRunner. class ) @ContextConfiguration ( "classpath:applicationContext.xml" ) public class test_aop_args { @Autowired CompactDisc cd; @Autowired TrackCounter trackCounter; @Test public void test(){ cd.playTrack( "Sgt. Pepper's Lonely Hearts Club Band" ); cd.playTrack( "With a Little Help from My Friends" ); cd.playTrack( "Lucy in the Sky with Diamonds" ); cd.playTrack( "Sgt. Pepper's Lonely Hearts Club Band" ); cd.playTrack( "With a Little Help from My Friends" ); cd.playTrack( "Sgt. Pepper's Lonely Hearts Club Band" ); System.out.println(trackCounter.getPlayCount( "Sgt. Pepper's Lonely Hearts Club Band" )); System.out.println(trackCounter.getPlayCount( "With a Little Help from My Friends" )); System.out.println(trackCounter.getPlayCount( "Lucy in the Sky with Diamonds" )); System.out.println(trackCounter.getPlayCount( "Getting Better" )); } } |
测试结果 3,2,1,0
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/u013905744/article/details/78690027