AOP基本操作和知识
AOP作用:
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
例如-------在登陆页面登录时,需要添加一个权限判断功能,使用AOP则可以在不改变原来的代码的情况下,将权限判断功能实现
通俗来讲,就是不通过修改源代码的方式,在主干功能里添加新功能
AOP底层原理:
1)AOP底层使用动态代理——两种情况
一,有接口情况,使用JDK动态代理——创建接口实现类的代理对象,增强类的方法
二,无接口,使用CGLIB动态代理——创建当前类子类的代理对象,增强类的方法
JDK动态代理小例子
第一步——使用newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)方法
方法有三个参数
第一个——类加载器
第二个——增强方法所在的类,这个类实现的接口(支持多个接口)
第三个——实现这个接口InvocationHandler,创建代理对象,写增强的方法
第二步——编写代码
1)——创建接口,定义方法
package AOP.初级JDK动态代理; public interface Userdao { public int add(int a, int b); public String update(String id); }
2)——创建接口实现类,实现方法
package AOP.初级JDK动态代理; public class UserdaoImpl implements Userdao { @Override public int add(int a, int b) { return a+b; } @Override public String update(String id) { return id; } }
3)——使用Proxy类创建接口代理对象
package AOP.初级JDK动态代理;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class JDKProxy {
public static void main(String[] args) {
//newProxyInstance第二个参数为数组类型
Class[] interfaces = {Userdao.class};
//创建接口实现类的代理对象
//第三个参数可以使用匿名内部类来创建
// Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// return null;
// }
// })
UserdaoImpl userdao = new UserdaoImpl();
//接口等于实现类对象
Userdao dao = (Userdao)Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces,new UserdaoProxy(userdao));
int result = dao.add(1,2);
System.out.println(result);
}
}
//创建代理对象代码
class UserdaoProxy implements InvocationHandler{
//创建的是谁的代理对象,就需要把谁传递过来,因为增强逻辑是需要执行原有的代码的
//通过有参构造传递
private Object obj;
public UserdaoProxy(Object obj) {
this.obj = obj;
}
//增强的逻辑代码
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//原有方法执行前执行增强逻辑代码
System.out.println("方法执行前..需要执行的方法名:"+method.getName()+"---传递的参数:"+ Arrays.toString(args));
//执行原有代码,并且在原代码之上进行判断增强
Object res = null;
if(method.getName() == "update"){
System.out.println("方法是"+method.getName());
}else{
res = method.invoke(obj,args);
}
//原有方法执行后执行增强逻辑代码
System.out.println("方法执行之后..."+res);
return res;
}
}
AOP术语
连接点 类里面哪些方法可以被增强,这些方法被称为连接点
切入点 实际被增强的方法,被称为切入点
通知(增强) 实际增强的逻辑部分,被称为通知或者增强 通知又分成几种
*前置通知
*后置通知
*环绕通知
*异常通知
*最终通知
切面 切面是一个动作,是把通知应用到切入点的过程
浙公网安备 33010602011771号