亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

《Spring實戰》學習筆記(三)面向切面的Spring

2019-11-14 09:13:39
字體:
來源:轉載
供稿:網友

使用注解創建切面

定義切面

代碼結構

這里寫圖片描述

程序清單

PS:定義切面

package concert;import org.aspectj.lang.annotation.*;@Aspectpublic class Audience { @Pointcut("execution(** concert.Performance.perform(..))") public void performance() {} @Before("performance()") public void silenceCellPhones() { System.out.PS:java配置,@EnableAspectJAutoProxy啟用AspectJ自動代理

package concert;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration@EnableAspectJAutoProxy@ComponentScanpublic class ConcertConfig { @Bean public Audience audience() { return new Audience(); }}

PS:切點接口

package concert;public interface Performance { public void perform();}

PS:切點接口實現

package concert;import org.springframework.stereotype.Component;@Componentpublic class PerformanceImpl implements Performance { public void perform() { System.out.println("Singing!!!"); }}

PS:如果通過xml裝配bean

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="concert"/> <aop:aspectj-autoproxy /> <bean class="concert.Audience" /></beans>

測試

import concert.ConcertConfig;import concert.Performance;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = ConcertConfig.class)public class PerformanceTest { @Autowired private Performance performance; @Test public void perform() { performance.perform(); }}

這里寫圖片描述

創建環繞通知

PS:把上面的切面代碼改為如下。

package concert;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;@Aspectpublic class Audience { @Pointcut("execution(** concert.Performance.perform(..))") public void performance() {} @Around("performance()") public void watchPerformance(ProceedingJoinPoint jp) { try { System.out.println("Silencing cell phones"); System.out.println("Taking seats"); jp.proceed(); System.out.println("CLAP CLAP CLAP!!!"); } catch (Throwable e) { System.out.println("Demanding a refund"); } }}

處理通知中的參數

代碼結構

這里寫圖片描述

程序清單

package soundsystem;import java.util.List;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; } public void play() { System.out.println("Playing "+title+" by "+artist); for(String track : tracks) { System.out.println("-Track: "+track); } } public void playTrack(int trackNumber) { System.out.println("Playing track"+trackNumber); }}package soundsystem;public interface CompactDisc { public void play(); public void playTrack(int trackNumber);}package soundsystem;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import java.util.HashMap;import java.util.Map;@Aspectpublic class TrackCounter { private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>(); @Pointcut("execution(* soundsystem.CompactDisc.playTrack(int)) "+"&& args(trackNumber)") public void trackPlayed(int trackNumber) {} @Before("trackPlayed(trackNumber)") public void countTrack(int trackNumber) { int currentCount = getPlayCount(trackNumber); trackCounts.put(trackNumber, currentCount+1); } public int getPlayCount(int trackNumber) { return trackCounts.containsKey(trackNumber) ? trackCounts.get(trackNumber) : 0; }}package soundsystem;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;import java.util.ArrayList;import java.util.List;@Configuration@EnableAspectJAutoProxypublic class TrackCounterConfig { @Bean public CompactDisc sgtPeppers() { BlankDisc cd = new BlankDisc(); cd.setTitle("hello"); cd.setArtist("world"); List<String> tracks = new ArrayList<String>(); tracks.add("11111"); tracks.add("22222"); tracks.add("33333"); tracks.add("44444"); tracks.add("55555"); cd.setTracks(tracks); return cd; } @Bean public TrackCounter trackCounter() { return new TrackCounter(); }}

測試

import org.junit.Rule;import org.junit.Test;import org.junit.contrib.java.lang.system.StandardOutputStreamLog;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import soundsystem.CompactDisc;import soundsystem.TrackCounter;import soundsystem.TrackCounterConfig;import static org.junit.Assert.assertEquals;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes= TrackCounterConfig.class)public class TrackCounterTest { @Rule public final StandardOutputStreamLog log = new StandardOutputStreamLog(); @Autowired private CompactDisc cd; @Autowired private TrackCounter counter; @Test public void testTrackCounter() { cd.playTrack(1); cd.playTrack(2); cd.playTrack(3); cd.playTrack(3); cd.playTrack(3); cd.playTrack(3); cd.playTrack(7); cd.playTrack(7); assertEquals(1, counter.getPlayCount(1)); assertEquals(1, counter.getPlayCount(2)); assertEquals(4, counter.getPlayCount(3)); assertEquals(0, counter.getPlayCount(4)); assertEquals(0, counter.getPlayCount(5)); assertEquals(0, counter.getPlayCount(6)); assertEquals(2, counter.getPlayCount(7)); }}

這里寫圖片描述

通過注解引入新功能

參考:Spring Aop 使用注解引入新功能

代碼結構

這里寫圖片描述

程序清單

PS:不需要,沒有用到

package concert;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;@Aspectpublic class Audience { @Pointcut("execution(** concert.Performance.perform(..))") public void performance() {} @Around("performance()") public void watchPerformance(ProceedingJoinPoint jp) { try { System.out.println("Silencing cell phones"); System.out.println("Taking seats"); jp.proceed(); System.out.println("CLAP CLAP CLAP!!!"); } catch (Throwable e) { System.out.println("Demanding a refund"); } }}

PS:注入EncoreableIntroducer

package concert;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration@EnableAspectJAutoProxy@ComponentScanpublic class ConcertConfig { @Bean public Audience audience() { return new Audience(); } @Bean public EncoreableIntroducer encoreableIntroducer() { return new EncoreableIntroducer(); }}

PS:Encoreable實現類

package concert;public class DefaultEncoreable implements Encoreable { public void performEncore() { System.out.println("performEncore!!!"); }}

PS:Encoreable接口

package concert;public interface Encoreable { public void performEncore();}

PS:EncoreableIntroducer切面,加號表示Performance所有子類型,不是Performance本身

package concert;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.DeclareParents;@Aspectpublic class EncoreableIntroducer { @DeclareParents(value="concert.Performance+",defaultImpl = DefaultEncoreable.class) public static Encoreable encoreable;}

PS:Performance接口

package concert;public interface Performance { public void perform();}

PS:Performance實現類

package concert;import org.springframework.stereotype.Component;@Componentpublic class PerformanceImpl implements Performance { public void perform() { System.out.println("Singing!!!"); }}

測試

import concert.ConcertConfig;import concert.Encoreable;import concert.Performance;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.applicationContext;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = ConcertConfig.class)public class PerformanceTest { @Autowired private ApplicationContext context; @Test public void performEncore() { //對象performanceImpl不僅有PerformanceImpl的功能,也有DefaultEncoreable類的功能 Encoreable encoreable = (Encoreable) context.getBean("performanceImpl"); encoreable.performEncore(); }}

這里寫圖片描述


在XML聲明切面

聲明前置和后置通知

<aop:config> <aop:aspect ref="audience"> <aop:pointcut id="performance" expression="execution(** concert.Performance.perform(..))"/> <aop:before pointcut-ref="performance" method="silenceCellPhones" /> <aop:before pointcut-ref="performance" method="takeSeats" /> <aop:after-returning pointcut-ref="performance" method="applause" /> <aop:after-throwing pointcut-ref="performance" method="demandRefund" /> </aop:aspect></aop:config>package concert;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;public class Audience { public void silenceCellPhones() { System.out.println("Silencing cell phones"); } public void takeSeats() { System.out.println("Taking seats"); } public void applause() { System.out.println("CLAP CLAP CLAP!!!"); } public void demandRefund() { System.out.println("Demanding a refund"); }}

聲明環繞通知

<aop:config> <aop:aspect ref="audience"> <aop:pointcut id="performance" expression="execution(** concert.Performance.perform(..))"/> <aop:around pointcut-ref="performance" method="watchPerformance"/> </aop:aspect></aop:config>package concert;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.*;public class Audience { public void watchPerformance(ProceedingJoinPoint jp) { try { System.out.println("Silencing cell phones"); System.out.println("Taking seats"); jp.proceed(); System.out.println("CLAP CLAP CLAP!!!"); } catch (Throwable e) { System.out.println("Demanding a refund"); } }}

為通知傳遞參數

package soundsystem;import java.util.HashMap;import java.util.Map;public class TrackCounter { private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>(); public void countTrack(int trackNumber) { int currentCount = getPlayCount(trackNumber); trackCounts.put(trackNumber, currentCount+1); } public int getPlayCount(int trackNumber) { return trackCounts.containsKey(trackNumber) ? trackCounts.get(trackNumber) : 0; }}<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="trackCounter" class="soundsystem.TrackCounter"/> <bean id="cd" class="soundsystem.BlankDisc"> <property name="title" value="hello"/> <property name="artist" value="world"/> <property name="tracks"> <list> <value>11111</value> <value>22222</value> <value>33333</value> <value>44444</value> <value>55555</value> </list> </property> </bean> <aop:config> <aop:aspect ref="trackCounter"> <aop:pointcut id="trackPlayed" expression="execution(* soundsystem.CompactDisc.playTrack(int)) and args(trackNumber)"/> <aop:before pointcut-ref="trackPlayed" method="countTrack"/> </aop:aspect> </aop:config></beans>

通過切面引入新的功能

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <context:component-scan base-package="concert"/> <aop:aspectj-autoproxy /> <bean id="audience" class="concert.Audience" /> <bean id="encorebleDelegate" class="concert.DefaultEncoreable"/> <aop:config> <aop:aspect ref="audience"> <aop:pointcut id="performance" expression="execution(** concert.Performance.perform(..))"/> <aop:around pointcut-ref="performance" method="watchPerformance"/> </aop:aspect> <aop:aspect> <aop:declare-parents types-matching="concert.Performance+" implement-interface="concert.Encoreable" delegate-ref="encorebleDelegate"/> </aop:aspect> </aop:config></beans>
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲日韩中文字幕在线播放| 91视频免费在线| 日韩三级影视基地| 欧美成人手机在线| 91超碰中文字幕久久精品| 中文字幕亚洲综合久久筱田步美| 国产精品91久久久久久| 成人a在线视频| 91亚洲永久免费精品| 91免费在线视频网站| 欧美午夜激情视频| 91久久国产婷婷一区二区| 成人一区二区电影| 欧美激情第1页| 久久久久久久久久久91| 欧美大尺度电影在线观看| 久久久久国产精品免费网站| 国产精品美女免费视频| 色爱av美腿丝袜综合粉嫩av| 日韩成人性视频| 日韩av大片免费看| 亚洲精品在线不卡| 久久人人爽人人爽人人片av高清| 美日韩精品免费观看视频| 欧美午夜久久久| 狠狠综合久久av一区二区小说| 国产精品尤物福利片在线观看| 欧美色欧美亚洲高清在线视频| 成人欧美一区二区三区在线湿哒哒| 久久好看免费视频| 亚洲美女在线看| 精品美女久久久久久免费| 亚洲一区二区三区四区视频| 伊人久久久久久久久久| 美女av一区二区三区| 亚洲成年人在线| 懂色aⅴ精品一区二区三区蜜月| 久久人人看视频| 精品久久久91| 亚洲bt天天射| 中文字幕视频一区二区在线有码| 热re99久久精品国产66热| 国产狼人综合免费视频| 欧美电影在线免费观看网站| 精品日韩视频在线观看| 色偷偷噜噜噜亚洲男人的天堂| 日本午夜精品理论片a级appf发布| 4438全国亚洲精品在线观看视频| 91成人在线视频| 国产精品18久久久久久首页狼| 日韩免费高清在线观看| 91色琪琪电影亚洲精品久久| 日韩经典中文字幕| 国产精品久久久久aaaa九色| 亚洲国产另类 国产精品国产免费| 欧美床上激情在线观看| 亚洲电影免费观看高清| 奇米一区二区三区四区久久| 久久久久久久色| 亚洲欧洲高清在线| 日本国产精品视频| 韩国v欧美v日本v亚洲| 91精品综合久久久久久五月天| 亚洲电影第1页| 亚洲国产精品999| 日韩三级成人av网| 91精品国产九九九久久久亚洲| 国产精品毛片a∨一区二区三区|国| 另类天堂视频在线观看| 欧美最顶级丰满的aⅴ艳星| 丰满岳妇乱一区二区三区| 国产精品jizz在线观看麻豆| 亚洲小视频在线观看| 国产精品欧美一区二区| 国产欧美欧洲在线观看| 91国内在线视频| 在线国产精品视频| 亚洲免费视频观看| 久久综合久中文字幕青草| 日韩精品在线观看网站| 国产亚洲一区二区在线| 韩国19禁主播vip福利视频| 亚洲国产精品网站| 亚洲精品自拍第一页| 亚洲黄页视频免费观看| 久久免费成人精品视频| 国产欧美最新羞羞视频在线观看| 中文字幕欧美专区| 久久韩剧网电视剧| 国产精品人成电影| 日韩hd视频在线观看| 97免费视频在线播放| 欧美日韩国产在线播放| 一区二区三区在线播放欧美| 久久久久久免费精品| 亚洲精品中文字幕av| 欧美成aaa人片免费看| 日韩午夜在线视频| 国产在线精品播放| 欧美片一区二区三区| 国产视频一区在线| 亚洲综合色激情五月| 38少妇精品导航| 亚洲综合社区网| 国产在线视频欧美| 日韩久久免费电影| 国产精品影院在线观看| 成人福利免费观看| 国产成人免费91av在线| 91精品在线国产| 亚洲午夜av久久乱码| 日本在线观看天堂男亚洲| 亚洲区在线播放| 国产精品18久久久久久首页狼| 国产在线不卡精品| 欧洲永久精品大片ww免费漫画| 夜夜嗨av一区二区三区四区| 精品国产欧美一区二区五十路| 性欧美xxxx视频在线观看| 亚洲欧美日韩天堂一区二区| 久久97久久97精品免视看| 在线播放国产精品| 久热精品视频在线观看| 国产精品丝袜一区二区三区| 68精品国产免费久久久久久婷婷| 91精品国产沙发| 91精品在线看| 国产欧美一区二区白浆黑人| 国产成人一区二区三区小说| 欧美日韩在线观看视频| 国产激情久久久| 欧美一级大片在线免费观看| 国产成人亚洲综合青青| 久久久精品一区二区三区| 日韩精品在线免费观看视频| 91社影院在线观看| 日本aⅴ大伊香蕉精品视频| 国产经典一区二区| 57pao成人永久免费视频| 性欧美xxxx| 欧美黄色性视频| 日韩在线一区二区三区免费视频| 色偷偷综合社区| 欧美老女人www| 色yeye香蕉凹凸一区二区av| 久久精品国产69国产精品亚洲| 性亚洲最疯狂xxxx高清| 国产精品99久久久久久白浆小说| 精品久久久久久久久中文字幕| 日韩亚洲第一页| 欧美性猛交xxxx乱大交3| 久久综合伊人77777| 色偷偷av亚洲男人的天堂| 成人黄色在线播放| 91亚洲国产成人久久精品网站| 亚洲欧美国产精品专区久久| 久久精品国产亚洲精品| 午夜精品久久久久久久白皮肤| 亚洲国模精品私拍| 欧美在线一级va免费观看| 黑人巨大精品欧美一区二区三区| 91国偷自产一区二区三区的观看方式| 亚洲性69xxxbbb| 精品视频一区在线视频|