Spring學習 之 AOP

1.lib包的引入

  • commons-logging-1.2.jar
  • spring-aop-5.2.3.RELEASE.jar
  • spring-aspects-5.2.3.RELEASE.jar
  • spring-beans-5.2.3.RELEASE.jar
  • spring-context-5.2.3.RELEASE.jar
  • spring-core-5.2.3.RELEASE.jar
  • spring-expression-5.2.3.RELEASE.jar

 Aspectj下載地址

  • aspectjrt.jar
  • aspectjtools.jar
  • aspectjweaver.jar
  • org.aspectj.matcher.jar

2.xml的作成

    命名空間 aop bean contect 的引入

3.切面代碼的作成 LoggingAspect

  •     前置通知
  •     後置通知
  •     返回通知
  •     異常通知

4.測試類的作成

  •     正常測試
  •     異常測試

5.代碼分享

接口

package com.spring.apo;

public interface ArtthemticCalculator {
	int add(int i ,int j); 
	int sub(int i ,int j); 
	int mul(int i ,int j); 
	int div(int i ,int j); 
}

實現類

package com.spring.apo;

import org.springframework.stereotype.Component;

@Component("artthemticCalculator")
public class ArtthemticCalculatorImpl implements ArtthemticCalculator {

	@Override
	public int add(int i, int j) {

		int result = i + j;
		return result;
	}

	@Override
	public int sub(int i, int j) {

		int result = i - j;
		return result;
	}

	@Override
	public int mul(int i, int j) {

		int result = i * j;
		return result;
	}

	@Override
	public int div(int i, int j) {

		int result = i / j;
		return result;
	}
}

日誌切面

package com.spring.apo;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {
	
	/**
	 * 在com.spring.apo.ArtthemticCalculator
	 * 的每一個方法執行之前 執行的處理
	 */
	@Before("execution(public int com.spring.apo.ArtthemticCalculator.*(..))")
	public void beforeMethod(JoinPoint joinPoint){
		
		String methodName = joinPoint.getSignature().getName();
		Object[] args = joinPoint.getArgs();
		System.out.println("前置通知方法名: " + methodName + "  方法參數為:" + Arrays.asList(args));
	}

	/**
	 * 在com.spring.apo.ArtthemticCalculator
	 * 的每一個方法執行之後 執行的處理
	 * 無論正常還是異常終了
	 * 不能接受到返回值
	 */
	@After("execution(public int com.spring.apo.ArtthemticCalculator.*(..))")
	public void afterMethod(JoinPoint joinPoint){
		
		String methodName = joinPoint.getSignature().getName();
		System.out.println("後置通知方法名: " + methodName + "  方法返回值不能取得。");
	}
	
	/**
	 * 在com.spring.apo.ArtthemticCalculator
	 * 的每一個方法執行之後 執行的處理
	 * 僅僅是正常終了
	 * 可以接受到返回值
	 * @param joinPoint
	 */
	@AfterReturning(value = "execution(public int com.spring.apo.ArtthemticCalculator.*(..))",
			 	returning="result")
	public void afterReturning(JoinPoint joinPoint,Object result){
		
		String methodName = joinPoint.getSignature().getName();
		System.out.println("返回通知方法名: " + methodName + "  方法返回值可以取得,且返回值爲:" + result);
	}
	
	/**
	 * 在com.spring.apo.ArtthemticCalculator
	 * 的每一個方法執行之後 執行的處理
	 * 僅僅是異常終了
	 * 可以接受到返回值
	 * @param joinPoint
	 */
	@AfterThrowing(value = "execution(public int com.spring.apo.ArtthemticCalculator.*(..))",
			 	throwing="ex")
	public void afterThrowing(JoinPoint joinPoint,Exception ex){
		
		String methodName = joinPoint.getSignature().getName();
		System.out.println("異常通知方法名: " + methodName + "  方法異常終了,且異常爲:" + ex);
	}
	/**
	 * 環繞通知
	 * 相當於動態代理
	 */
	@Around("execution(public int com.spring.apo.ArtthemticCalculator.*(..))")
	public Object aroundMethod(ProceedingJoinPoint pjp){
		
		Object result = null;
		String methodName = pjp.getSignature().getName();
		Object[] args = pjp.getArgs();
		
		try {
			
			System.out.println("【環繞通知】前置通知方法名: " + methodName + "  方法參數為:" + Arrays.asList(args));
			result = pjp.proceed();
			System.out.println("【環繞通知】返回通知方法名: " + methodName + "  方法返回值可以取得,且返回值爲:" + result);
			
		} catch (Throwable e) {
			
			System.out.println("【環繞通知】異常通知方法名: " + methodName + "  方法異常終了,且異常爲:" + e);
			e.printStackTrace();
		}finally{
			System.out.println("【環繞通知】後置通知方法名: " + methodName + "  方法返回值不能取得。");
		}
		
		return result;
	}
}

配置文件

<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	       http://www.springframework.org/schema/beans/spring-beans.xsd
		   http://www.springframework.org/schema/aop 
		   http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
		   http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	
	<!-- 配置自動掃描的包 -->
	<context:component-scan base-package="com.spring.apo"></context:component-scan>
	
<!-- 	<aop:aspect-autoproxy></aop:aspect-autoproxy> -->
<!-- 	<aop:aspectj-autoproxy /> -->
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

</beans>

測試類

package com.spring.apo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Mainaop3 {

	public static void main(String[] args) {

		ApplicationContext atx = new ClassPathXmlApplicationContext("applicationContext.xml");
		ArtthemticCalculator target = (ArtthemticCalculator) atx.getBean("artthemticCalculator");
		
		System.out.println(target.getClass().getName());
		
		int result = target.add(3, 8);
//		System.out.println(result);
		System.out.println();
		
		result = target.sub(16, 8);
//		System.out.println(result);
		System.out.println();
		
		result = target.mul(16, 8);
//		System.out.println(result);
		System.out.println();
		
		result = target.div(72, 8);
//		System.out.println(result);
		System.out.println();
		
		// 異常測試
//		result = target.div(72, 0);
//		System.out.println();
	}
}

 

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