「Spring」AOP基本概念

87 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

AOP的实现原理

概述

什么是AOP?

AOP并不是Spring专属的,他只是一种开发模式,在不修改源代码的情况下对代码进行增强。借助于动态代理的模式进行开发

不使用Spring如何实现AOP?

类的方法本身是有实现接口来的:使用JDK动态代理

实现:

创建接口实现类代理对象,增强类的方法

  1. 创建要增强的对象:创建要增强的接口和实现类

    public interface UserInfo {
        void sayHello();
    }
    public class UserInfoImpl implements UserInfo{
        @Override
        public void sayHello() {
            System.out.print("hello");
        }
    }
    
  2. 创建增强对象:代理对象中参数需要实现了InvocationHandler的对象

    class UserInfoProxy implements InvocationHandler {
        private Object obj;
        public UserInfoProxy(Object obj) {
            this.obj = obj;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            //增强的目标方法
            method.invoke(obj, args);
            //要增强的逻辑
            System.out.println(" my Name is Tom");
            return null;
        }
    }
    
  3. 创建接口实现类代理对象执行业务逻辑:业务执行的时候不直接使用对应的实现类来执行,而是使用接口的代理对象执行对应的方法。所以要创建接口的代理对象

    public class JDKProxy {
    ​
        public static void main(String[] args) {
            UserInfo userInfo = new UserInfoImpl();
            //创建接口实现类代理对象
            Class[] interfaces = {
                    UserInfo.class
            };
            UserInfo info = (UserInfo) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserInfoProxy(userInfo));
            info.sayHello();
        }
    }
    
  4. 结果输出:hello my Name is Tom

类的方法本身不是实现接口来的:使用CGLIB动态代理

实现:

创建子类的代理对象,增强类的方法

UserInfo中sayHello。然后Person中继承UserInfo。在sayHello方法的实现先调用super.sayHello();然后写具体的增强逻辑

AOP概念

  • 连接点:一个类中的可以被增强的方法就叫做连接点:比如上述的UserInfo中的sayHello()

  • 切点:实际被增强的方法,就称为切点

  • 切面:一个动作:将通知应用到切点的操作动作就是切面

  • 通知:增强的逻辑代码。System.out.println(" my Name is Tom");

    • 前置通知:
    • 后置通知:方法执行完
    • 环绕通知:前后都通知
    • 异常通知:出现异常才执行切面代码
    • 最终通知:有没有异常都会执行