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术语

  连接点  类里面哪些方法可以被增强,这些方法被称为连接点

  切入点  实际被增强的方法,被称为切入点

  通知(增强)  实际增强的逻辑部分,被称为通知或者增强  通知又分成几种

        *前置通知

        *后置通知

        *环绕通知

        *异常通知

        *最终通知

  切面  切面是一个动作,是把通知应用到切入点的过程

 

posted on 2021-08-19 19:43  倾城烟雨楼  阅读(148)  评论(0)    收藏  举报

导航