`AOP`底层原理

AOP

什么是AOP
  1. 面向切面编程(方面),利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
  2. 通俗说:不通过修改源代码的基础上,在主干功能里面添加新功能
  3. 使用登录例子说明AOP

在这里插入图片描述
例如:在上述的登录功能中,需要添加一个用户权限的判断的功能,前提在不修改原来的代码基础上实现,这时就可以使用我们的动态代理模式进行实现。

AOP底层原理实现有两种方式:

  1. 有接口情况,使用JDK动态代码
  2. 没有接口情况,使用CGLIB动态代码

AOP基于jdbk动态代理的实现

使用JDK动态代理,使用Proxy类里面的方法创建代理对象

动态代理实现步骤:

  1. 代理对象和真实对象实现相同的接口
  2. 调用Proxy类中静态方法newProxyInstance方法
  3. 使用代理对象调用方法method.invoke("传入真实对象","参数")方法【这个方法目的是调用需要被增强的方法】
  4. 对方法进行增强

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。  
第一个参数是:当前类的加载路径,类名.Class.getClassLoader
第二个参数是:代理类实现的接口
		注意是:如果传入是接口:直接`接口名.Class`如:
				Class[] loginClass = {UserLogin.class};
		如果传入是接口的实现类:`接口实现类名.Class.IgetInterfaces`



public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return null;
    }
    
    
    Object proxy:表示需要增强类对象
    Method method:表示增强的方法
    Object[] args:表示增强方法的参数

	method.invoke,表示调用需要被增强的方法

实现的步骤

1.定义一个登录接口UserLogin

public interface UserLogin {
    // 用于实现登录功能
    void login();
}

2.定义登录接口实现类UserLoginImpl

public class UserLoginImpl implements UserLogin{
    @Override
    public void login() {
        System.out.println("登录成功!");
    }
}

3.创建增强类
也就是对被方法的执行增强,增强的方式有

  1. 前置通知:就是在增强该方法前执行
  2. 后置通知:就是在增强该方法后执行
  3. 环绕通知:就是在该方法前后都会执行
  4. 异常通知:就是该方法出现异常才会执行
  5. 最终通知:就是该方法不管是否出现异常都会执行
/**
 * @Author 海康
 * @Version 1.0
 */

// 功能增强类
public class EnhanceClass {
    public void enhance(){
        System.out.println("增强权限判断》》》");
    }
}

4.创建代理类
在该类中传入需要代理接口的实现对象

/**
* @Author 海康
* @Version 1.0
*/
public class ProxyClass implements InvocationHandler {
    // 传入需要代表接口实现类
    private UserLogin userLogin;
    public ProxyClass(UserLogin userLogin){
        this.userLogin = userLogin;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 登录成功后进行功能增强,调用被增强的方法
        Object invoke = method.invoke(userLogin, args);
        // 创建增强类对象
        EnhanceClass enhanceClass = new EnhanceClass();
        enhanceClass.enhance();
        return invoke;
    }
}

5.test

class TestProxy{
    @Test
    public void testProxyObject(){
        // 创建接口实现类
        UserLogin userLogin = new UserLoginImpl();
        // 创建代理类对象
        ProxyClass proxyClass = new ProxyClass(userLogin);
        // 调用Proxy类中的静态方法
        // 第一个参数:
        ClassLoader classLoader = TestProxy.class.getClassLoader();
        // 第二个参数:【重点】[下面演示两个参数传入,只需要传入其中的一个]
        // 如果传入是: 接口
        Class[] inter = {UserLogin.class};
        // 如果传入是:接口的实现类,还需要getInterfaces()方法返回该类实现的接口
        Class<?>[] interfaces = userLogin.getClass().getInterfaces();
        // 第三个参数:代理类对象,也就是上面的 proxyClass
        UserLogin o = (UserLogin) Proxy.newProxyInstance(classLoader, inter, proxyClass);
        o.login();
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值