Spring AOP 基于注解实现

Spring AOP基于XML的配置实现

基于注解的声明式 AspectJ

注解名称描述
@Aspectp用于定义一个切面。
@Pointcute用于定义切入点表达式。在使用时还需定义一个包含名字和任意参数的方法签名来表示切入点名称。实际上,这个方法签名就是一个返回值为void,且方法体为空的普通的方法。
@Before用于定义前置通知,相当于BeforeAdvice.在使用时,通常需要指定一个value属性值,该属性值用于指定一个切入点表达式(可以是已有的切入点,也可以直接定义切入点表达式)。
@AfterRetuming用于定义后置通知,相当于AferRetumingAdvice.在使用时可以指定pointeutvalue和retuming属性,其中pointcutivalue这两个属性的作用一样,都用于指定切入点表达式。retuming属性值用于表示Advice方法中可定义与此同名的形參,该形参可用于访问目标方法的返回值。
@Arounde用于定义环绕通知,相当于Methodinerceptor.在使用时需要指定一个value属性,该属性用于指定该通知被织入的切入点。
@AfterThrowing’用于定义异常通知来处理程序中未处理的异常,相当于ThrowAdvice.在使用时可指定pointcut value和throwing属性。其中pointcutivalue用于指定切入点表达式,而throwing属性值用于指定- - 个形参名来表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法抛出的异常。
@Aftere用于定义最终final 通知,不管是否异常,该通知都会执行。使用时需要指定一个value属性,该属性用于指定该通知被织入的切入点。
@DeclareParents用于定义引介通知,相当于Introductioninterceptor

引入jar 包

  • aopaliance.jar
  • aspectjweaver.jar

配置

测试代码

applicationContext.xml

<!-- 开启注解对AOP的支持 -->	
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

<!-- 将测试类加入IOC容器 -->
	<bean id="logBefore" class="cust.zaw.aop.LogBefore"></bean>
	<bean id="log" class="cust.zaw.aop.Log"></bean>
业务类
package cust.zaw.aop;

public class Log {
	public  void addLog() {
		System.out.println("addLoad()方法");
	}
	public String deleteLog() {
		System.out.println("deleteLogLoad()方法");
		return "nice";
	}
}
通知类
package cust.zaw.aop;

import java.lang.reflect.Method;
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;

@Aspect				//声明此类是一个通知
public class LogBefore{

	/*
	 * 前置通知
	 */
	 
	@Before("execution(public void cust.zaw.aop.Log.addLog())")    //属性:定义切点
	public void before(JoinPoint jp) {
		System.out.println("前置通知");
		System.out.println("目标对象:"+jp.getTarget()+"方法名:"+jp.getSignature().getName()+"参数列表"+Arrays.toString(jp.getArgs()));
	}	
	
	/*
	 * 后置通知
	 */
	 
	@AfterReturning(pointcut="execution(public String cust.zaw.aop.Log.deleteLog())",returning="returningValue")    
	public void after(JoinPoint jp,Object returningValue) {
		System.out.println("后置通知");
		System.out.println("返回值"+returningValue);
	}	
	
	/*
	 * 异常通知
	 */
	 
	//捕获特定异常
	@AfterThrowing(pointcut="execution(public void cust.zaw.aop.Log.addLog())",throwing="e")
	public void exception(JoinPoint pj,NullPointerException e) {//此通知只捕获空指针异常
		System.out.println("异常通知"+e.getMessage());
	}
	
	/*
	 * 环绕通知
	 */
	 
	@Around("execution(public void cust.zaw.aop.Log.addLog())")
	public void arround(ProceedingJoinPoint jp) {
		//方法执行之前:前置通知
		System.out.println("[环绕]前置通知");
		try {
			//方法执行时
			jp.proceed();
			//方法执行之前之后:后置通知
			System.out.println("[环绕]后置通知");
		}catch(Throwable e){
			//发生异常
			System.out.println("[环绕]异常通知");
		}finally {
			//最终通知
			System.out.println("[环绕]最终通知");
		}
	}
	
	/*
	 * 最终通知
	 */
	 
	@After("execution(public void cust.zaw.aop.Log.addLog())")
	public void after() {
		System.out.println("最终通知");
	}
}
测试类
package cust.zaw.aop;

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

public class AopTest {
	public static void main(String[] args)
	{
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		Log log=(Log)context.getBean("log");
		log.addLog();
		log.deleteLog();
	}

}

输出:
前置通知
目标对象:cust.zaw.aop.Log@1c93084c方法名:addLog参数列表[]
addLoad()方法

addLoad()方法
deleteLogLoad()方法
后置通知
返回值nice

[环绕]前置通知
addLoad()方法
[环绕]后置通知
deleteLogLoad()方法

addLoad()方法
最终通知
deleteLogLoad()方法

在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页