笔记11 在XML中声明切面(2)
笔记11 在XML中声明切面(2)
为通知传递参数
1.声明一个CompactDiscs接口。内部包含两个方法:
-
- show() 用于显示唱片的名字和艺术风格
- playTrack(int number) 根据传入的磁道数播放相应磁道的音乐(假设每个磁道就一首歌)
1 package XMLsoundsystem; 2 3 public interface CompactDiscs { 4 void show(); 5 6 void playTrack(int number); 7 }
2.实现接口的类BlankDisc
1 package XMLsoundsystem; 2 3 import java.util.List; 4 5 public class BlankDisc implements CompactDiscs { 6 private String title; 7 private String artist; 8 private List<String> tracks; 9 10 public String getTitle() { 11 return title; 12 } 13 14 public void setTitle(String title) { 15 this.title = title; 16 } 17 18 public String getArtist() { 19 return artist; 20 } 21 22 public void setArtist(String artist) { 23 this.artist = artist; 24 } 25 26 public List<String> getTracks() { 27 return tracks; 28 } 29 30 public void setTracks(List<String> tracks) { 31 this.tracks = tracks; 32 } 33 34 @Override 35 public void playTrack(int number) { 36 System.out.println(tracks.get(number - 1)); 37 } 38 39 @Override 40 public void show() { 41 System.out.println("唱片的名字:" + title); 42 System.out.println("唱片属于的艺术流派:" + artist); 43 } 44 45 }
3.无注解的TrackCounter,用来记录播放的次数。
1 package XMLsoundsystem; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class TrackCounter { 7 private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>(); 8 9 public void countTrack(int trackNumber) { 10 int currentCount = getPlayCount(trackNumber); 11 trackCounts.put(trackNumber, currentCount + 1); 12 } 13 14 public int getPlayCount(int trackNumber) { 15 return trackCounts.containsKey(trackNumber) ? trackCounts.get(trackNumber) : 0; 16 } 17 }
4.XML配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xmlns:c="http://www.springframework.org/schema/c" 8 xsi:schemaLocation=" 9 http://www.springframework.org/schema/beans 10 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 15 http://www.springframework.org/schema/context 16 http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 17 <bean id="trackCounter" class="XMLsoundsystem.TrackCounter"></bean> 18 <bean id="cd" class="XMLsoundsystem.BlankDisc"> 19 <property name="title" value="AAAAABBBBCCCC"></property> 20 <property name="artist" value="CCCCCBBBBBAAAA"></property> 21 <property name="tracks"> 22 <list> 23 <value>9999999999</value> 24 <value>8888888888</value> 25 <value>7777777777</value> 26 <value>6666666666</value> 27 <value>5555555555</value> 28 </list> 29 </property> 30 </bean> 31 <aop:config> 32 <aop:aspect ref="trackCounter"> 33 <aop:pointcut expression="execution(* XMLsoundsystem.CompactDiscs.playTrack(int)) and args(trackNumber)" id="trackPlayed"/> 34 <aop:before pointcut-ref="trackPlayed" method="countTrack"/> 35 </aop:aspect> 36 </aop:config> 37 </beans>
5.测试
1 package XMLsoundsystem; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.test.context.ContextConfiguration; 7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 9 @RunWith(SpringJUnit4ClassRunner.class) 10 @ContextConfiguration("classpath:ConcertConfig4.xml") 11 public class TrackCounterTest { 12 @Autowired 13 private CompactDiscs cd; 14 @Autowired 15 private TrackCounter counter; 16 17 @Test 18 public void test() { 19 cd.show(); 20 cd.playTrack(1); 21 cd.playTrack(2); 22 cd.playTrack(2); 23 cd.playTrack(3); 24 cd.playTrack(3); 25 cd.playTrack(3); 26 cd.playTrack(4); 27 cd.playTrack(4); 28 cd.playTrack(4); 29 cd.playTrack(5); 30 cd.playTrack(5); 31 for (int i = 1; i < 6; i++) { 32 System.out.println("磁道" + i + "播放了" + counter.getPlayCount(i) + "次"); 33 } 34 } 35 }
6.结果
通过切面引入新的功能
1.定义表演接口Performance.java
1 package concert3; 2 3 public interface Performance { 4 public void perform(); 5 }
2.实现接口,Classcial.java
1 package concert3; 2 3 public class Classcial implements Performance { 4 5 @Override 6 public void perform() { 7 // TODO Auto-generated method stub 8 System.out.println("我是古典音乐会!"); 9 } 10 11 }
3.定义观众类,即切面 Audience.java
1 package concert3; 2 3 import org.aspectj.lang.ProceedingJoinPoint; 4 5 public class Audience { 6 7 // ProceedingJoinPoint作为参数。 8 // 这个对象是必须要有的,因为 你要在通知中通过它来调用被通知的方法。 9 // 通知方法中可以做任何的 事情,当要将控制权交给被通知的方法时,它需要调 用ProceedingJoinPoint的proceed()方法。 10 public void watchPerformance(ProceedingJoinPoint jp) { 11 try { 12 System.out.println("Silencing cell phone"); 13 System.out.println("Taking seats"); 14 jp.proceed(); 15 System.out.println("CLAP CLAP CLAP"); 16 } catch (Throwable e) { 17 System.out.println("Demanding a refund"); 18 } 19 } 20 }
4.定义新功能接口 Encoreable.java
1 package concert3; 2 3 public interface Encoreable { 4 void performEncore(); 5 }
5.实现新接口DefaultEncoreable.java
1 package concert3; 2 3 public class DefaultEncoreable implements Encoreable { 4 5 @Override 6 public void performEncore() { 7 // TODO Auto-generated method stub 8 System.out.println("川剧变脸"); 9 } 10 11 }
6.XML配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xmlns:c="http://www.springframework.org/schema/c" 8 xsi:schemaLocation=" 9 http://www.springframework.org/schema/beans 10 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 13 http://www.springframework.org/schema/tx 14 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 15 http://www.springframework.org/schema/context 16 http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 17 18 <bean class="concert3.Classcial"></bean> 19 <bean id="audience" class="concert3.Audience"></bean> 20 <aop:config> 21 <aop:aspect ref="audience"> 22 <aop:pointcut expression="execution(* concert3.Performance.perform(..))" id="performance"/> 23 <aop:around method="watchPerformance" pointcut-ref="performance"/> 24 <aop:declare-parents types-matching="concert3.Performance+" 25 implement-interface="concert3.Encoreable" 26 default-impl="concert3.DefaultEncoreable"/> 27 </aop:aspect> 28 </aop:config> 29 </beans>
7.测试
1 package concert3; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.test.context.ContextConfiguration; 7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 9 @RunWith(SpringJUnit4ClassRunner.class) 10 // @ContextConfiguration(classes = concert3.ConcertConfig.class) 11 @ContextConfiguration("classpath:ConcertConfig5.xml") 12 public class ConcertTest { 13 @Autowired 14 public Performance p; 15 @Autowired 16 public Encoreable en; 17 18 @Test 19 public void test() { 20 21 p.perform(); 22 System.out.println("-----------------------------"); 23 System.out.println("自己创建对象调用"); 24 en.performEncore(); 25 System.out.println("-----------------------------"); 26 System.out.println("通过Performance对象调用“新方法”"); 27 Encoreable e = (Encoreable) p; 28 e.performEncore(); 29 } 30 }
8.结果