一、

假设有情形如:cd里有很多轨,当播放音乐时,要统计每个音轨的播放次数,这些统计操作不应放在播放方法里,因为统计不是播放音乐的主要职责,这种情况适合应用AOP。

二、

1.

package soundsystem;public interface CompactDisc {void play();void playTrack(int trackNumber);
}

2.

 1 package soundsystem;
 2
 3 import java.util.List;
 4
 5 public class BlankDisc implements CompactDisc {
 6
 7     private String title;
 8     private String artist;
 9     private List<String> tracks;
10
11     public BlankDisc() {
12         super();
13     }
14
15     public BlankDisc(String title, String artist, List<String> tracks) {
16         this.title = title;
17         this.artist = artist;
18         this.tracks = tracks;
19     }
20
21     public void play() {
22         System.out.println("Playing " + title + " by " + artist);
23         for (String track : tracks) {
24             System.out.println("-Track: " + track);
25         }
26     }
27
28     public String getTitle() {
29         return title;
30     }
31
32     public void setTitle(String title) {
33         this.title = title;
34     }
35
36     public String getArtist() {
37         return artist;
38     }
39
40     public void setArtist(String artist) {
41         this.artist = artist;
42     }
43
44     public List<String> getTracks() {
45         return tracks;
46     }
47
48     public void setTracks(List<String> tracks) {
49         this.tracks = tracks;
50     }
51
52     @Override
53     public void playTrack(int trackNumber) {
54         System.out.println("playTrack---->" + trackNumber);
55     }
56
57 }

3.

 1 package soundsystem;
 2
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 import org.aspectj.lang.annotation.Aspect;
 6 import org.aspectj.lang.annotation.Before;
 7 import org.aspectj.lang.annotation.Pointcut;
 8
 9 @Aspect
10 public class TrackCounter {
11     private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>();
12
13     @Pointcut("execution(* soundsystem.CompactDisc.playTrack(int)) "
14             + "&& args(trackNumber)")
15     public void trackPlayed(int trackNumber) {
16     }
17
18     @Before("trackPlayed(trackNumber)")
19     public void countTrack(int trackNumber) {
20         int currentCount = getPlayCount(trackNumber);
21         trackCounts.put(trackNumber, currentCount + 1);
22     }
23
24     public int getPlayCount(int trackNumber) {
25         return trackCounts.containsKey(trackNumber) ? trackCounts
26                 .get(trackNumber) : 0;
27     }
28 }

The thing to focus on in the figure is the args(trackNumber) qualifier in the pointcut expression. This indicates that any int argument that is passed into the execution of playTrack() should also be passed into the advice. The parameter name,trackNumber , also matches the parameter in the pointcut method signature.

4.配置文件

 1 package soundsystem;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 import org.springframework.context.annotation.Bean;
 7 import org.springframework.context.annotation.Configuration;
 8 import org.springframework.context.annotation.EnableAspectJAutoProxy;
 9
10 @Configuration
11 @EnableAspectJAutoProxy
12 public class TrackCounterConfig {
13     @Bean
14     public CompactDisc cd() {
15         BlankDisc cd = new BlankDisc();
16         cd.setTitle("Sgt. Pepper's Lonely Hearts Club Band");
17         cd.setArtist("The Beatles");
18         List<String> tracks = new ArrayList<String>();
19         tracks.add("Sgt. Pepper's Lonely Hearts Club Band");
20         tracks.add("With a Little Help from My Friends");
21         tracks.add("Lucy in the Sky with Diamonds");
22         tracks.add("Getting Better");
23         tracks.add("Fixing a Hole");
24         // ...other tracks omitted for brevity...
25         cd.setTracks(tracks);
26         return cd;
27     }
28
29     @Bean
30     public TrackCounter trackCounter() {
31         return new TrackCounter();
32     }
33 }

5.或xml作配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/aop
 3 http://www.springframework.org/schema/aop/spring-aop.xsd
 4 http://www.springframework.org/schema/beans
 5 http://www.springframework.org/schema/beans/spring-beans.xsd">
 6     <bean id="trackCounter" class="soundsystem.TrackCounter" />
 7     <bean id="cd" class="soundsystem.BlankDisc">
 8         <property name="title" value="Sgt. Pepper's Lonely Hearts Club Band" />
 9         <property name="artist" value="The Beatles" />
10         <property name="tracks">
11             <list>
12                 <value>Sgt. Pepper's Lonely Hearts Club Band</value>
13                 <value>With a Little Help from My Friends</value>
14                 <value>Lucy in the Sky with Diamonds</value>
15                 <value>Getting Better</value>
16                 <value>Fixing a Hole</value>
17                 <!-- ...other tracks omitted for brevity... -->
18             </list>
19         </property>
20     </bean>
21     <aop:config>
22         <aop:aspect ref="trackCounter">
23             <aop:pointcut id="trackPlayed" expression="execution(* soundsystem.CompactDisc.playTrack(int))
24 and args(trackNumber)" />
25             <aop:before pointcut-ref="trackPlayed" method="countTrack" />
26         </aop:aspect>
27     </aop:config>
28 </beans>

6.测试

 1 package soundsystem;
 2
 3 import static org.junit.Assert.assertEquals;
 4
 5 import org.junit.Rule;
 6 import org.junit.Test;
 7 import org.junit.contrib.java.lang.system.StandardOutputStreamLog;
 8 import org.junit.runner.RunWith;
 9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.test.context.ContextConfiguration;
11 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
12
13 @RunWith(SpringJUnit4ClassRunner.class)
14 @ContextConfiguration(classes = TrackCounterConfig.class)
15 public class TrackCounterTest {
16     @Rule
17     public final StandardOutputStreamLog log = new StandardOutputStreamLog();
18     @Autowired
19     private CompactDisc cd;
20     @Autowired
21     private TrackCounter counter;
22
23     @Test
24     public void testTrackCounter() {
25         cd.playTrack(1);
26         cd.playTrack(2);
27         cd.playTrack(3);
28         cd.playTrack(3);
29         cd.playTrack(3);
30         cd.playTrack(3);
31         cd.playTrack(7);
32         cd.playTrack(7);
33         assertEquals(1, counter.getPlayCount(1));
34         assertEquals(1, counter.getPlayCount(2));
35         assertEquals(4, counter.getPlayCount(3));
36         assertEquals(0, counter.getPlayCount(4));
37         assertEquals(0, counter.getPlayCount(5));
38         assertEquals(0, counter.getPlayCount(6));
39         assertEquals(2, counter.getPlayCount(7));
40     }
41 }

转载于:https://www.cnblogs.com/shamgod/p/5239999.html

SPRING IN ACTION 第4版笔记-第四章ASPECT-ORIENTED SPRING-008-带参数的ADVICE相关推荐

  1. SPRING IN ACTION 第4版笔记-第四章Aspect-oriented Spring-001-什么是AOP

    一. Aspect就是把会在应用中的不同地方重复出现的非业务功能的模块化,比如日志.事务.安全.缓存 In software development, functions that span mult ...

  2. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-008-SpEL介绍

    一. 1.SpEL expressions are framed with  #{ ... } 2.SpEl的作用 Sp EL has a lot of tricks up its sleeves, ...

  3. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-003-@Conditional根据条件生成bean及处理profile...

    一.用@Conditional根据条件决定是否要注入bean 1. package com.habuma.restfun;public class MagicBean {} 2. package co ...

  4. SPRING IN ACTION 第4版笔记-第二章-004-Bean是否单例

    spring的bean默认是单例,加载容器是会被化,spring会拦截其他再次请求bean的操作,返回spring已经创建好的bean. It appears that the CompactDisc ...

  5. SPRING IN ACTION 第4版笔记-第二章-002-@ComponentScan、@Autowired的用法

    一.@ComponentScan 1. @Configuration //说明此类是配置文件 @ComponentScan //开启扫描,会扫描当前类的包及其子包 public class CDPla ...

  6. SPRING IN ACTION 第4版笔记-第二章-001-用@Autowired\@ComponentScan、@Configuration、@Component实现自动装载bean...

    1. 1 package soundsystem; 2 import org.springframework.context.annotation.ComponentScan; 3 import or ...

  7. 【Python学习笔记—保姆版】第四章—关于Pandas、数据准备、数据处理、数据分析、数据可视化

    第四章 欢迎访问我搞事情的[知乎账号]:Coffee 以及我的[B站漫威剪辑账号]:VideosMan 若我的笔记对你有帮助,请用小小的手指,点一个大大的赞哦. #编译器使用的是sypder,其中&q ...

  8. 计算机网络(第7版)谢希仁著 学习笔记 第四章网络层

    计算机网络(第7版)谢希仁著 学习笔记 第四章网络层 第四章 网络层 4.3划分子网和构造超网 p134 4.3.1划分子网 4.3.2使用子网时分组的转发 4.3.3无分类编址CIDR(构建超网) ...

  9. Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25

    Effective Java(第三版) 学习笔记 - 第四章 类和接口 Rule20~Rule25 目录 Rule20 接口优于抽象类 Rule21 为后代设计接口 Rule22 接口只用于定义类型 ...

最新文章

  1. CEPH添加MDS操作
  2. 查看SqlServer的内存使用情况
  3. XP局域网访问无权限、不能互相访问问题的完整解决方案
  4. win7 安装PyTorch
  5. XML PUBLISHER输出excel禁止自动将数字格式化处理
  6. ServletContext_功能_域对象
  7. 程序员过关斩将--自定义线程池来实现文档转码
  8. BootStrap笔记-popover的使用(popover中放验证码,点击更新)
  9. linux修改默认python版本_将Linux下python默认版本切换成替代版本
  10. Android使用的工具类
  11. redis常用监控命令
  12. Python为什么要self
  13. can not connect to mysql server翻译_Message:Can not connect to MySQL server的解决办法
  14. Java学习(10) —— 常用类
  15. C++读写操作ofstream(数据丢失问题)
  16. Golden Software BLN文件格式
  17. 怪异,漂亮的几个数学恒等式(转)
  18. 怎样在Word添加页码?经验干货!word如何插入页码?
  19. 2015秋招经历和总结
  20. 终于有人把智慧城市和边缘计算说清楚了

热门文章

  1. 文件操作(文件指针+顺序/随机读写)
  2. 关于TCP三次握手过程
  3. bp算法运行太慢_神经网络,BP算法的理解与推导
  4. python二级证书考试时间表_2019上半年计算机二级考试时间:3月30日至4月1日
  5. java 双向链表_Day26:二叉搜索树与双向链表
  6. jquery的语法结构包括哪几部分?_牙釉质的组织学结构具体包括哪几部分
  7. Office文档转pdf和图片之NodeJS
  8. PHP 发送GET 和 POST数据的方法分析
  9. linux内核字符驱动设备,Linux学习笔记——linux内核字符设备驱动-Go语言中文社区...
  10. 微信开发者工具不显示二维码问题