笔记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.结果

 

 

posted @ 2018-04-19 22:31  雨落忧伤-  阅读(288)  评论(0编辑  收藏  举报