zoukankan      html  css  js  c++  java
  • 笔记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.结果

     

  • 相关阅读:
    【论文阅读笔记】《StarGAN》
    【数据分析入门】泰坦尼克号生存率预测(一)
    【DLPytorch】Optimizer(一)
    【论文阅读笔记】《Pix2Pix》
    【论文阅读笔记】《DCGAN》
    【论文阅读笔记】《Conditional Generative Adversarial Nets》
    【论文阅读笔记】Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks
    【Datawhale】Python从入门到放弃
    【数字图像处理】 直方图的均衡与规定化
    GAN学习入门篇(一)
  • 原文地址:https://www.cnblogs.com/lyj-gyq/p/8886662.html
Copyright © 2011-2022 走看看