Spring Aop例項之xml配置
上篇博文《3幅圖讓你瞭解Spring AOP》中介紹了aop通知型別,AOP的配置方式有2種方式:xml配置和AspectJ註解方式。今天我們就來實踐一下xml配置方式。
我採用的jdk代理,所以首先將介面和實現類程式碼附上
package com.tgb.aop; public interface UserManager { public String findUserById(int userId); } package com.tgb.aop; public class UserManagerImpl implements UserManager { public String findUserById(int userId) { System.out.println("---------UserManagerImpl.findUserById()--------"); if (userId <= 0) { throw new IllegalArgumentException("該使用者不存在!"); } return "張三"; } }
單獨寫一個Advice通知類進行測試。這個通知類可以換成安全性檢測、日誌管理等等。
package com.tgb.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; /** * Advice通知類 * 測試after,before,around,throwing,returning Advice. * @author Admin * */ public class XMLAdvice { /** * 在核心業務執行前執行,不能阻止核心業務的呼叫。 * @param joinPoint */ private void doBefore(JoinPoint joinPoint) { System.out.println("-----doBefore().invoke-----"); System.out.println(" 此處意在執行核心業務邏輯前,做一些安全性的判斷等等"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of doBefore()------"); } /** * 手動控制呼叫核心業務邏輯,以及呼叫前和呼叫後的處理, * * 注意:當核心業務拋異常後,立即退出,轉向After Advice * 執行完畢After Advice,再轉到Throwing Advice * @param pjp * @return * @throws Throwable */ private Object doAround(ProceedingJoinPoint pjp) throws Throwable { System.out.println("-----doAround().invoke-----"); System.out.println(" 此處可以做類似於Before Advice的事情"); //呼叫核心邏輯 Object retVal = pjp.proceed(); System.out.println(" 此處可以做類似於After Advice的事情"); System.out.println("-----End of doAround()------"); return retVal; } /** * 核心業務邏輯退出後(包括正常執行結束和異常退出),執行此Advice * @param joinPoint */ private void doAfter(JoinPoint joinPoint) { System.out.println("-----doAfter().invoke-----"); System.out.println(" 此處意在執行核心業務邏輯之後,做一些日誌記錄操作等等"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of doAfter()------"); } /** * 核心業務邏輯呼叫正常退出後,不管是否有返回值,正常退出後,均執行此Advice * @param joinPoint */ private void doReturn(JoinPoint joinPoint) { System.out.println("-----doReturn().invoke-----"); System.out.println(" 此處可以對返回值做進一步處理"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of doReturn()------"); } /** * 核心業務邏輯呼叫異常退出後,執行此Advice,處理錯誤資訊 * @param joinPoint * @param ex */ private void doThrowing(JoinPoint joinPoint,Throwable ex) { System.out.println("-----doThrowing().invoke-----"); System.out.println(" 錯誤資訊:"+ex.getMessage()); System.out.println(" 此處意在執行核心業務邏輯出錯時,捕獲異常,並可做一些日誌記錄操作等等"); System.out.println(" 可通過joinPoint來獲取所需要的內容"); System.out.println("-----End of doThrowing()------"); } }
只有Advice還不行,還需要在application-config.xml中進行配置:
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="userManager" class="com.tgb.aop.UserManagerImpl"/> <!--<bean id="aspcejHandler" class="com.tgb.aop.AspceJAdvice"/>--> <bean id="xmlHandler" class="com.tgb.aop.XMLAdvice" /> <aop:config> <aop:aspect id="aspect" ref="xmlHandler"> <aop:pointcut id="pointUserMgr" expression="execution(* com.tgb.aop.*.find*(..))"/> <aop:before method="doBefore" pointcut-ref="pointUserMgr"/> <aop:after method="doAfter" pointcut-ref="pointUserMgr"/> <aop:around method="doAround" pointcut-ref="pointUserMgr"/> <aop:after-returning method="doReturn" pointcut-ref="pointUserMgr"/> <aop:after-throwing method="doThrowing" throwing="ex" pointcut-ref="pointUserMgr"/> </aop:aspect> </aop:config> </beans>
編一個客戶端類進行測試一下:
package com.tgb.aop;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Client {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager userManager = (UserManager)factory.getBean("userManager");
//可以查詢張三
userManager.findUserById(1);
System.out.println("=====我==是==分==割==線=====");
try {
// 查不到資料,會拋異常,異常會被AfterThrowingAdvice捕獲
userManager.findUserById(0);
} catch (IllegalArgumentException e) {
}
}
}
結果如圖:
值得注意的是Around與Before和After的執行順序。3者的執行順序取決於在xml中的配置順序。圖中標記了3塊,分別對應Before,Around,After。其中②中包含有③。這是因為aop:after配置到了aop:around的前面,如果2者調換一下位置,這三塊就會分開獨立顯示。如果配置順序是aop:after -> aop:around ->aop:before,那麼①和③都會包含在②中。這種情況的產生是由於Around的特殊性,它可以做類似於Before和After的操作。當安全性的判斷不通過時,可以阻止核心業務邏輯的呼叫,這是Before做不到的。
使用xml可以對aop進行集中配置。很方便而簡單。可以對所有的aop進行配置,當然也可以分開到單獨的xml中進行配置。當需求變動時,不用修改程式碼,只要重新配置aop,就可以完成修改操作。
相關推薦
Spring Aop例項之xml配置
上篇博文《3幅圖讓你瞭解Spring AOP》中介紹了aop通知型別,AOP的配置方式有2種方式:xml配置和AspectJ註解方式。今天我們就來實踐一下xml配置方式。
Spring AOP+AspectJ在XML配置例項(詳解)
在本教程中,我們將向你展示如何轉換上章節中 轉成基於XML的配置。對於那些不喜歡註釋,使用JDK1.4,則可以基於XML,而不使用 AspectJ。再次回顧上個 customerBo 介面中的幾個方法,以後你將學會如何在 XML檔案實現 AspectJ 攔截。File:Cus
Spring AOP + AspectJ in XML 配置示例
In this tutorial, we show you how to convert last Spring AOP + AspectJ annotation into XML based configuration. For those don’t like annot
spring aop之xml配置
背景:記錄aop的使用方式。aop相關術語概念自行了解清楚,以下僅貼示例。 spring 版本:5.0.8.RELEASE 相關jar包,參考一下附件pom.xml DAO bean package com.spring.aop.dao.bean; public class Us
spring事務管理,xml配置aop事務和註解配置aop事務
mov ref itcast template password nds eth poi ntc xml配置和註解配合共同代碼 AccountService.java public interface AccountService { //轉賬方法
Spring Aop例項@Around、@Before、@After、@AfterReturning 、@AfterThrowing註解方式配置
用過spring框架進行開發的人,多多少少會使用過它的AOP功能,都知道有@Before、@Around和@After等advice。最近,為了實現專案中的輸出日誌和許可權控制這兩個需求,我也使用到了AOP功能。我使用到了@Before、@Around這兩個advice。但在,使用過程中,卻
Spring之XML配置Bean的屬性註入
配置 紅色 引用 entry code 轉義 空格 color 文本 Spring中XML文件配置Bean的簡單示例,如下: <bean id="car" class="com.smart.ditype.Car"> <property n
Spring之XML配置Bean的屬性注入
Spring中XML檔案配置Bean的簡單示例,如下: <bean id="car" class="com.smart.ditype.Car"> <property name="color"> <value>紅色&
spring aop的基於xml以及註解的配置
AOP概述 springAOP:面向切面程式設計。是面向物件程式設計的一種有效補充。面向物件程式設計的三大要素是繼承、多型和封裝。即在類設計時,要求讓不同的類設計不同的方法。但是這種模式下,也會產生一些弊端。比如增加了程式碼的重複性。比如我們想在類中增加日誌的記錄,如果讓每個類都做日
初步學習Spring Aop使用之配置方式
前言: 初步學習接觸Spring框架使用,而在這裡對自己剛學的Aop使用做個小篇幅的總結,方便日後需要用到是可以快速入手! 僅用於對自己學習個人筆記,不做任意分享,純屬個人理解不想誤認子弟! 一、Aop知識點理解 AOP稱為面向切面程式設計,在程式開發中主要用來解決一些系統
05 Spring Aop例項(AOP 如此簡單)@Aspect、@Around 註解方式配置
轉載請註明來源 賴賴的部落格 導語 沒有什麼是不可以改變的,換個角度看世界,截然不同! IoC相關的基本內容告一段落,本次介紹Spring的第二個特性,AOP,面向切面程式設計,術語聽起來比較不容易理解,沒關係,一切盡在例項中,讓我們看一個簡單
Spring AOP實驗之靜態代理
註入 ans 執行 軟件開發 動態代理 sin modified 實現 編譯 1 AOP的概念和原理 1.1 AOP原理 AOP(Aspect Oriented Programming),也就是面向方面編程的技術。AOP基於IoC基礎,是對OOP的有益補充。
spring AOP解析之註解方式詳解
parser 分享 pro asp mes aop log space spec 命名空間處理器是AopNamespaceHandler,我們可以看到這裏註冊了幾個解析器,第一個我們知道是xml形式的解析,接下來我們看AspectJAutoProxyBeanDefiniti
使用Redisson實現分布式鎖,Spring AOP簡化之
獲取鎖 rip dss 執行c lease dset wire template alt 源碼 Redisson概述 Redisson是一個在Redis的基礎上實現的Java駐內存數據網格(In-Memory Data Grid)。它不僅提供了一系列的分布式的Java常用對
spring boot 導入xml配置文件所需註解和禁用自動配置類的註解
gpo exclude col 開始 XML post 正在 pri ann 導入XML配置 如果您絕對必須使用基於XML的配置,我們建議您仍然從一個@Configuration類開始。然後您可以使用@ImportResource註釋來加載XML配置文件。
spring AOP的兩種配置方式
can 之前 top () 就是 記錄 string -s 服務 連接點(JoinPoint) ,就是spring允許你是通知(Advice)的地方,那可就真多了,基本每個方法的前、後(兩者都有也行),或拋出異常是時都可以是連接點,spring只支持方法連接點。其
Spring Cloud實踐之集中配置Spring-config
serve 啟動 gap rop project 自己的 HA sna tst 將一個系統中各個應用的配置文件集中起來,方便管理。 import org.springframework.boot.SpringApplication; import org.spri
騰訊分分彩源碼帶龍虎和玩法自言自語Spring依賴註入(XML配置)
類屬性 aslist when sid one != spi 匿名 sam 至於基於XML依賴註入的過程,首先要找一個比較合適的入口,那就是getBean。那麽具體是怎麽實現的呢?首先寫個測試方法: ClassPathXmlApplicationContext app =
Java框架-Spring概念及純xml配置
1. 三層架構中的spring及spring概述 1.1 三層架構中的spring Spring框架對三層架構都有支援,dao提供支援(如JDBCTemplate)、service提供事務支援、web提供了springmvc框架支援等。 1.2 Spring的
cors跨域請求問題 關於spring -springmvc -mybatis .基於xml配置方式
1:場景還原 今天要寫一個方法, 需求是 在購物車服務上, 呼叫一個個人中心的方法 ,用到了 跨域請求. 我就在個人中心的 上面寫了個方法, 並在springMVC.xml中,配置了 &