Spring学习AOP

Posted 看,那条狗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习AOP相关的知识,希望对你有一定的参考价值。

接口

package com.spring.aop;

public interface ArithmeticCalculator {

	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.aop;

import org.springframework.stereotype.Component;

@Component("arithmeticCalculator")
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {

	@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;
	}

}

  

AOP类

LoggingAspect

package com.spring.aop;

import java.util.ArrayList;
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.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/*
 * @Component 被Spring管理
 * @Aspect	声明为切面
 * @Order 切面优先级,值越小优先级越高
 */
@Order(1)
@Component
@Aspect
public class LoggingAspect {
	
	/**
	 * 定义一个方法,用于声明切入点表达式。
	 * 使用@Pointcut来声明切入点表达式
	 * 后面的其他通知直接通过方法名引用当前表达式
	 */
	@Pointcut("execution(public * ArithmeticCalculator.*(..))")
	public void declareJoinPointExpression(){}
	

//	/**
//	 * 前置通知
//	 * 在ArithmeticCalculator接口的每一个实现类方法执行之前执行
//	 * @param joinPoint
//	 */
//	@Before("execution(public * ArithmeticCalculator.*(..))")
//	public void beforeMethod(JoinPoint joinPoint){
//		String methodName = joinPoint.getSignature().getName();
//		Object[] args =joinPoint.getArgs();
//		System.out.println("the method"+methodName+" start with"+Arrays.asList(args));
//		
//	}
//	/**
//	 * 后置通知
//	 * 方法执行完之后执行的代码,无论是否出现异常都执行
//	 * @param joinPoint
//	 */
//	@After("execution(public * ArithmeticCalculator.*(..))")
//	public void afterMethod(JoinPoint joinPoint){
//		String methodName = joinPoint.getSignature().getName();
//		System.out.println("the Method "+methodName+" ends");
//	}
//	
//	
//	/**
//	 * 返回通知
//	 * 在方法正常结束之后执行的通知 
//	 * 可以访问到方法的返回值
//	 * @param joinPoint
//	 * @param result
//	 */
//	@AfterReturning(value="execution(public * ArithmeticCalculator.*(..))",returning="result")
//	public void afterReturningMethod(JoinPoint joinPoint,Object result){
//		String methodName = joinPoint.getSignature().getName();
//		System.out.println("the method"+methodName+" end with "+result);
//		
//	}
//	
//	/**
//	 * 异常通知
//	 * 在方法执行发生异常时执行的方法
//	 * 可以返回异常
//	 * @param joinPoint
//	 * @param exception
//	 */
//	@AfterThrowing(value="execution(public * ArithmeticCalculator.*(..))",throwing="exception")
//	public void afterThrowingMethod(JoinPoint joinPoint,Exception exception){
//		String methodName = joinPoint.getSignature().getName();
//		System.out.println("the method "+methodName+"occus exception "+exception);
//		
//	}
	
	/**
	 * 环绕通知
	 */
	@Around("declareJoinPointExpression()")
	public Object aroundMethod(ProceedingJoinPoint joinPoint){
		Object result = null;
		String methodName = joinPoint.getSignature().getName();
		
		try {
//			前置通知
			System.out.println("the method "+methodName+"start with "+Arrays.asList(joinPoint.getArgs()));
//			执行方法
			result = joinPoint.proceed();
//			返回通知
			System.out.println("the method "+methodName+"end with "+result);
		} catch (Throwable e) {
//			异常通知
			System.out.println("The method " + methodName + " occurs exception:" + e);
			e.printStackTrace();
		}
//		后置通知
		System.out.println("The method " + methodName + " ends");
		
		return result;
	}
	
	
}

  

 

Spring配置文件

applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 7         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
 9     
10     <!-- 配置自动扫描的包 -->    
11     <context:component-scan base-package="com.spring.aop"></context:component-scan>      
12     
13     <!-- 使 aspect 注解起作用 -->
14     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>    
15      
16 </beans>

 

所需Jar包

com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.1.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar

 










以上是关于Spring学习AOP的主要内容,如果未能解决你的问题,请参考以下文章

spring aop中this和target区别

spring学习笔记AOP

Spring框架学习05——AOP相关术语详解

18spring注解学习(AOP)——AOP功能测试

SpringBoot AOP学习:Spring AOP实现日志功能

Spring AOP官方文档学习笔记之AOP概述