1. 程式人生 > >Spring Aop例項之xml配置

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 aopxml配置

背景:記錄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。但在,使用過程中,卻

SpringXML配置Bean的屬性註入

配置 紅色 引用 entry code 轉義 空格 color 文本 Spring中XML文件配置Bean的簡單示例,如下: <bean id="car" class="com.smart.ditype.Car"> <property n

SpringXML配置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中,配置了    &