Spring筆記之Spring的AOP支持

縱觀AOP編程,其中需要程序員參與的只有3個部分:

  • 定義普通業務組件
  • 定義切入點:一個切入點可能橫切多個業務組件
  • 定義增強處理:增強處理就是在AOP框架爲普通業務組件織入的處理動作

代理對象的方法 = 被代理對象的方法 + 增強處理

 

下面記錄一下,Spring中的AOP配置

<?xml version="1.0" encoding="UTF-8"?>
<beans ......
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="......
			http://www.springframework.org/schema/aop
			http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	
	<!-- 啓動@AspectJ支持 -->
	<aop:aspectj-autoproxy/>
	
	<!-- 如果不打算用Spring的XML Schema配置方式,則應該在Spring配置文件中增加如下片段來啓用@AspectJ支持 -->
	<!--<bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>-->
	
</beans>

 爲了在Spring應用中啓動@AspectJ支持,還需要在應用的類路徑中增加兩個AspectJ庫:aspectjweaver.jar和aspectjrt.jar,字節使用AspectJ安裝路徑的lib目錄下的兩個JAR文件即可。

 

1、定義切面Bean

使用@AspectJ標註一個Java類,該Java類將會作爲切面Bean

2、定義Before增強處理

package com.zhao.aopdemo;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;


@Aspect
public class BeforeAdviceTest {

	@Before("execution(* com.zhao.aopdemo.*.say*(..))")
	public void beforeSay()
	{
		System.out.println("Before say...");
	}
}

 

// Before註解

@Before("execution(* com.zhao.aopdemo.*.say*(..))")

解釋:com.zhao.aopdemo包下面所有類中的以say開頭的方法

3、定義AfterReturning增強處理

package com.zhao.aopdemo;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AfterReturningAdviceTest {

	@AfterReturning(returning = "word", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
	public void afterReturningSay(Object word) {
		System.out.println("After Returning say..." + word);
	}
}

 使用@AfterReturning 的時候,指定了一個returning的屬性,該屬性值爲word,這表明允許在增強處理方法afterReturningSay中使用名爲word的形參,該形參代表目標發那個發的返回值。

4、AfterThrowing增強處理

package com.zhao.aopdemo;

import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;

@Aspect
public class AfterThrowingTest {
	@AfterThrowing(throwing = "ex", pointcut = "execution(* com.zhao.aopdemo.*.say*(..))")
	public void afterThrowingSay(Throwable ex) {
		System.out.println("目標類拋出的異常:" + ex);
	}
}

 輸出:

Before say...

目標類拋出的異常:java.lang.ArithmeticException: / by zero

Exception in thread "main" java.lang.ArithmeticException: / by zero

at com.zhao.aopdemo.Chinese.sayThrowable(Chinese.java:21)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

......

主程序依然結束了

這裏afterThrowingSay方法的形參類型如果換成NullPointerException異常,該切入點就只匹配NullPointerException異常

 

5、After增強處理

Spring還提供了一個After增強處理,它與AfterReturning增強處理有點相似,但是也有區別

  • AfterReturning增強處理只有在目標方法成功完成後纔會被織入
  • After增強處理不管目標方法如何結束(包括成功完成和遇到異常終止兩種情況),它都會被織入

6、Around增強處理

未完待續...

發佈了36 篇原創文章 · 獲贊 3 · 訪問量 6477
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章