轻量级Java_EE企业应用实战-Spring的AOP(面向切面编程)

 Spring定义切入点和增强处理的方式

 1.1 基于Annotation的“零配置”方式

 

1.1.1 定义切面Bean

 

 

 

 1.1.2 定义Before增强处理

1.1.4 四种增强处理办法

package com.jtwl.office.controller;
/**
 * @todo
 * @author 成明俊
 * @email 1047914020@qq.com
 * @date 2020年3月16日
 */

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

//定义一个切面
@Aspect
public class FourAdviceTest {
	//定义Around增强处理执行
	@Around("execution(* com.jtwl.office.service.imp.*.*(..))")
	public Object processTx(ProceedingJoinPoint jp) throws java.lang.Throwable{
		System.out.println("Around增强:执行目标方法之前,模拟开始事务...");
		//访问执行目标方法的参数
		Object[] args = jp.getArgs();
		//当执行目标方法的参数存在
		//且第一个参数是字符串参数
		if (args !=null && args.length>0 && args[0].getClass() == String.class) {
			//改变第一个目标方法的第一个参数
			args[0] = "被改变的参数";
		}
		//执行目标方法,并保存目标方法执行后的返回值
		Object rvt = jp.proceed(args);
		System.out.println("Around增强,执行目标方法之后,模拟结束事务...");
		return rvt + "新增内容";
		
	}
	
	//定义Before增强处理执行
	@Before("execution(* com.jtwl.office.service.imp.*.*(..))")
	public void authority(JoinPoint jp) {
		System.out.println("Before增强:模拟执行权限检查");
		//返回被织入增强处理的目标方法
		System.out.println("Before增强:被植入处理的目标方法为:"+jp.getSignature().getName());
		//访问执行目标方法的参数
		System.out.println("Before增强: 目标方法的参数为:"+Arrays.toString(jp.getArgs()));
		//访问被增强处理的目标对象
		System.out.println("Before增强: 被织入增强处理的目标为:"+jp.getTarget());
	}
	
	//定义AfterReturning增强处理执行
	@AfterReturning(pointcut="execution(* com.jtwl.office.service.imp.*.*(..))", returning="rvt")
	public void log(JoinPoint jp, Object rvt) {
		System.out.println("AterReturning增强:获取目标方法返回值:"+rvt);
		System.out.println("AterReturning增强:模拟记录日志功能...");
		//返回被织入增强处理的目标方法
		System.out.println("AterReturning增强:被织入增强处理的目标方法为:"+ jp.getSignature().getName());
		//访问执行目标方法的参数
		System.out.println("AterReturning增强:目标方法的参数为:"+Arrays.toString(jp.getArgs()));
		//访问被增强处理的目标对象
		System.out.println("AterReturning增强:被织入增强处理的目标对象为:"+jp.getTarget());	
	}
	
	//定义After增强处理执行
	@After("execution(* com.jtwl.office.service.imp.*.*(..))")
	public void release(JoinPoint jp) {
		System.out.println("After增强:模拟方法结束后的释放资源");
		//返回被织入增强处理的目标方法
		System.out.println("Ater增强:被织入增强处理的目标方法为:"+ jp.getSignature().getName());
		//访问执行目标方法的参数
		System.out.println("Ater增强:目标方法的参数为:"+Arrays.toString(jp.getArgs()));
		//访问被增强处理的目标对象
		System.out.println("Ater增强:被织入增强处理的目标对象为:"+jp.getTarget());	
		
	}

}
Around增强:执行目标方法之前,模拟开始事务...
Before增强:模拟执行权限检查
Before增强:被植入处理的目标方法为:sayHello
Before增强: 目标方法的参数为:[被改变的参数]
Before增强: 被织入增强处理的目标为:com.jtwl.office.service.imp.Chinese2@a514af7
Around增强,执行目标方法之后,模拟结束事务...
After增强:模拟方法结束后的释放资源
Ater增强:被织入增强处理的目标方法为:sayHello
Ater增强:目标方法的参数为:[被改变的参数]
Ater增强:被织入增强处理的目标对象为:com.jtwl.office.service.imp.Chinese2@a514af7
AterReturning增强:获取目标方法返回值:被改变的参数Hello , Spring AOP新增内容
AterReturning增强:模拟记录日志功能...
AterReturning增强:被织入增强处理的目标方法为:sayHello
AterReturning增强:目标方法的参数为:[被改变的参数]
AterReturning增强:被织入增强处理的目标对象为:com.jtwl.office.service.imp.Chinese2@a514af7
被改变的参数Hello , Spring AOP新增内容

@Around 当定义一个Around处理方法时,该方法的第一个形参必须是ProceedingJoinPoint类型(至少包含一个形参),再增强处理方法体内,调用ProceedingJoinPoint的proceed()方法才会执行目标方法——这就是Around增强处理可以完全控制目标方法执行时机、如何执行的关键:荣国程序没有调用ProceedingJoinPoint的proceed()方法,则目标方法不会被执行。

 

@Before 使用Before增强处理只能再目标方法执行之前织入增强,使用Before增强处理无需理会目标方法的执行,Before增强处理执行时,目标方法还未获得执行的机会,所以before增强处理无法访问目标方法的返回值。

 

@AfterReturnIng增强处理

使用@AfterReturning Annotation时可指定如下两个常用属性:

pointcut/value:这两个属性的作用是一样的,他们都用于指定切入点对应的表达式/一样既可以是一个已有的切入点。也可以直接定义切入点表达式。当指定了pointcut属性值后,value属性值将会被覆盖。

returning: 指定一个返回值形参名,增强处理定义的方法可通过该形参来访问目标方法的返回值。

 

@After增强处理

与AfterReturning增强处理区别:

AfterReturing增强处理只有再目标方法成功完成后才会被织入。

After增强处理不管目标方法如何结束(包括成功完成和遇到异常终止两种情况),他都会被织入。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值