Spring aop学习笔记

AOP面向切面编程,通过动态代理实现

一个类加载器可以加载多个类
如何获得代理对象?
所有动态代理类全都继承Proxy类
JDK中提供了Proxy类newProxyInstance方法创建代理实例,有三个参数类加载器 实现要代理类的接口 如何实现代理类接口的方法,
用InvocationHandler实现,invoke方法实现
代理对象通过实现目标对象实现的接口代理

package com.atguigu.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyUtil {

	private MathImpl mathImpl;
	
	
	//为mathImpl赋值
	public ProxyUtil(MathImpl mathImpl) {
		super();
		this.mathImpl = mathImpl;
	}



	public Object getProxy() {
		//获取当前类的类加载器,用来加载代理对象所属类
		ClassLoader loader = this.getClass().getClassLoader();
		//获取目标对象实现的所有接口的Class,代理类回合目标类实现相同的接口,最终通过代理对象实现功能
		Class[] interfaces = mathImpl.getClass().getInterfaces();
				
		return Proxy.newProxyInstance(loader, interfaces, new InvocationHandler() {
			
			//代理对象实现功能的方式
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				// TODO Auto-generated method stub
				try {								//把数组转换成字符串
					MyLogger.before(method.getName(), Arrays.toString(args));
					Object result = method.invoke(mathImpl, args);//动态代理对象实现功能
					MyLogger.after(method.getName(), result);
					return result;
				} catch (Exception e) {
					// TODO: handle exception
					MyLogger.throwing();
					e.printStackTrace();
				} finally {
					System.out.println("哪都有我");
				}
				return null;
			}
		});
	}
	
}

**

AOP术语

**
横切关注点
非核心业务代码。从每个方法中抽取出来的同一类非核心业务。
切面(Aspect)
封装横切关注点信息的类,每个关注点体现为一个通知方法。
通知(Advice)
放在切面中的横切关注点。切面必须要完成的各个具体工作
目标(Target)
被通知的对象
代理(Proxy)
向目标对象应用通知之后创建的代理对象
连接点(Joinpoint)
横切关注点在程序代码中的具体体现,对应程序执行的某个特定位置。
例如:类某个方法调用前、调用后、方法捕获到异常后等。
切入点(pointcut):
定位连接点的方式。每个类的方法中都包含多个连接点,所以连接点是类中客观存在的事物。
如果把连接点看作数据库中的记录,那么切入点就是查询条件——AOP可以通过切入点定位到特定的连接点。
切点通过org.springframework.aop.Pointcut 接口进行描述,它使用类和方法作为连接点的查询条件。
在这里插入图片描述

AOP框架 aspectj

步骤
1.开启aspectj的自动代理功能
在配置文件中<aop:aspectj-autoproxy>
2.扫描包
3.在切面上定义两个注解@Component @@Aspect 目标类上也要添加@Component
4.在当前切面中写通知 例如:写个方法 方法上加@Before就是前置通知里面加上切入点表达式

前置通知作用域方法执行之前
@Before("execution(* com.atguigu.spring.aop.*.*(..))")
第一个*:public int
第二个*:类名
第三个*:方法
…:参数
@Aspect//用来标注当前类为切面
@Before//将方法指定为前置通知,必须设置value 其值为切入点表达式

public void beforeMethod(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();//获取方法参数
        String methodName = joinPoint.getSignature().getName();//获取方法名
        System.out.println("method:" + methodName + ",arguments:" + Arrays.toString(args));
}

@After:将方法标注为后置通知
后置通知:作用于方法的finally语句块,不管有没有异常都会执行

@AfterReturning将方法标注为返回值
返回通知:作用于方法执行之后
可通过returning设置接收方法返回值的变量名,要想在方法中使用,必须在方法的形参中设置和变量名相同的参数名的参数

@AfterThrowing:将方法标注为异常通知,当方法抛出异常时作用,作用于方法抛出异常时,
可通过thringing设置接受方法返回的异常信息
在参数列表中可通过具体异常类型,来获取指定的异常信息进行操作

@Order(1)定义切面优先级 值越小优先级越高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值