<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
傳統的登入原理:
如上圖所示這是一個基本的登入原理圖,但是如果我們想要在這個登入之上新增一些新的功能,比如許可權校驗
那麼我們能想到的就有兩種方法:
①:通過對原始碼的修改實現
②:不通過修改原始碼方式新增新的功能 (AOP)
什麼是AOP的技術?
在軟體業,AOP為Aspect Oriented Programming的縮寫,意為:面向切面程式設計
AOP是一種程式設計正規化,隸屬於軟工範疇,指導開發者如何組織程式結構
AOP最早由AOP聯盟的組織提出的,制定了一套規範.Spring將AOP思想引入到框架中,必須遵守AOP聯盟的規範
通過預編譯方式或者執行期動態代理實現程式功能的統一維護的一種技術
AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數語言程式設計的一種衍
生範型
利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程式的可
重用性,同時提高了開發的效率
AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼(事務管理、安全檢查、快取)
為什麼要學習AOP,可以在不修改原始碼的前提下,對程式進行增強!!
執行期間,不修改原始碼的情況下對已有的方法進行增強
優勢:
JDK的動態代理技術
1、為介面建立代理類的位元組碼檔案
2、使用ClassLoader將位元組碼檔案載入到JVM
3、建立代理類範例物件,執行物件的目標方法
cglib代理技術
為類生成代理物件,被代理類有沒
Joinpoint(連線點) 類裡面有哪些方法可以增強這些方法稱為連線點
Pointcut(切入點) – 所謂切入點是指我們要對哪些Joinpoint進行攔截的定義
Advice(通知/增強)-- 所謂通知是指攔截到Joinpoint之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)
Aspect(切面)-- 是 切入點+通知 的結合,以後咱們自己來編寫和設定的
增強:是對業務功能的擴充
AspectJ是一個面向切面的框架,它擴充套件了Java語言。AspectJ定義了AOP語法,AspectJ實際上是對AOP程式設計思想的一個實踐.
建立被增強的類:
public class Demo { //要增強,成為---->連線點---->切入點 public void login(){ //int a=10/0; System.out.println("登入。。。"); } }
將目標類設定到Spring中:
<bean id="demo" class="com.qcby.Demo"/>
定義切面類
package com.notice; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect //表明我們是通知 public class Power { //前置通知的方法 public void authentication(){ System.out.println("登入前---許可權驗證。。。"); } }
在spring.xml中組態檔中定義切面類:
<bean id="power" class="com.notice.Power"/>
在spring.xml中設定切面:
<aop:config> <!--aspect:前置通知,在登入前執行--> <aop:aspect ref="power"> <!--前置通知:--> <!--method:登入前執行的方法,許可權驗證的方法--> <!--pointcut:切入點,之後最終要執行的方法--> <!--前置通知:--> <aop:before method="authentication" pointcut="execution(public void com.qcby.Demo.login())"/> </aop:aspect> </aop:config>
測試:
public class DemoTest { @Test public void demo1(){ ApplicationContext ac = new ClassPathXmlApplicationContext("Spring.xml"); Demo demo = (Demo) ac.getBean("demo"); demo.login(); } }
也可以在spring.xml中加入其他通知方式:
<aop:config> <!--aspect:前置通知,在登入前執行--> <aop:aspect ref="power"> <!--前置通知:--> <!--method:登入前執行的方法,許可權驗證的方法--> <!--pointcut:切入點,之後最終要執行的方法--> <!--前置通知:--> <aop:before method="authentication" pointcut="execution(public void com.qcby.Demo.login())"/> <!--後置通知:當方法執行不成功的時候方法不執行--> <aop:after-returning method="authenticationEnd" pointcut="execution(public void com.qcby.Demo.login())"/> <!--當切入點(登入方法)發生異常的時候執行,沒有異常則不執行:--> <aop:after-throwing method="findThrowError" pointcut="execution(public void com.qcby.Demo.login())"/> <!--最終通知:無論切入點的方法執行成功與否,最終都執行的通知(增強)--> <aop:after method="finallyMethod" pointcut="execution(public void com.qcby.Demo.login())"/> <!--環繞通知:在切面前後執行方法--> <aop:around method="round" pointcut="execution(public void com.qcby.Demo.login())"/> </aop:aspect> </aop:config>
@Before – 前置通知
@AfterReturing – 後置通知
@Around – 環繞通知(目標物件方法預設不執行的,需要手動執行)
@After – 最終通知
@AfterThrowing – 異常丟擲通知
package com.notice; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Component @Aspect //表明我們是通知 public class Power { //增強的方法:許可權驗證 //@Before(value="execution(public void com.qcby.Demo.login())") //@AfterReturning(value="execution(public void com.qcby.Demo.login())") //前置通知 @Before(value="execution(public void com.qcby.Demo.login())") public void authentication(){ System.out.println("登入前---許可權驗證。。。"); } //後置通知 @AfterReturning(value="execution(public void com.qcby.Demo.login())") public void authenticationEnd(){ System.out.println("登入後---許可權驗證。。。"); } //發生異常時通知 @AfterThrowing(value="execution(public void com.qcby.Demo.login())") public void findThrowError(){ System.out.println("登入發現異常了"); } //最終通知 @After(value="execution(public void com.qcby.Demo.login())") public void finallyMethod(){ System.out.println("最終都執行的通知"); } //環繞通知 @Around(value="execution(public void com.qcby.Demo.login())") public void round(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("在登入之前進行了許可權驗證"); //之間執行登入的方法 proceedingJoinPoint.proceed(); System.out.println("在登入之後進行了許可權驗證"); } }
到此這篇關於Spring深入探索AOP切面程式設計的文章就介紹到這了,更多相關Spring AOP內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45