• Spring AOP原来是这样实现的


    Spring AOP 技术实现原理

    在Spring框架中,AOP(面向切面编程)是通过代理模式和反射机制来实现的。本文将详细介绍Spring AOP的技术实现原理,包括JDK动态代理和CGLIB代理的使用,并通过实例演示其在实际项目中的应用。

    1. AOP的实现原理概述

    Spring AOP的实现基于代理模式,通过代理对象来包装目标对象,实现切面逻辑的注入。

    2. JDK动态代理

    JDK动态代理是通过Java反射机制实现的,要求目标对象必须实现接口。

    2.1 创建切面类

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    
    public class LoggingAspect implements InvocationHandler {
    
        private Object target;
    
        public LoggingAspect(Object target) {
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Logging before method execution");
            Object result = method.invoke(target, args);
            System.out.println("Logging after method execution");
            return result;
        }
    }
    

    2.2 创建代理类

    import java.lang.reflect.Proxy;
    
    public class ProxyFactory {
    
        public static Object createProxy(Object target) {
            return Proxy.newProxyInstance(
                    target.getClass().getClassLoader(),
                    target.getClass().getInterfaces(),
                    new LoggingAspect(target)
            );
        }
    }
    

    3. CGLIB代理

    CGLIB代理是通过字节码生成技术实现的,可以代理没有实现接口的类。

    3.1 创建切面类

    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    public class LoggingAspect implements MethodInterceptor {
    
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("Logging before method execution");
            Object result = proxy.invokeSuper(obj, args);
            System.out.println("Logging after method execution");
            return result;
        }
    }
    

    3.2 创建代理类

    import net.sf.cglib.proxy.Enhancer;
    
    public class ProxyFactory {
    
        public static Object createProxy(Class targetClass) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(targetClass);
            enhancer.setCallback(new LoggingAspect());
            return enhancer.create();
        }
    }
    

    4. 示例演示

    让我们通过两个示例演示使用JDK动态代理和CGLIB代理实现Spring AOP。

    4.1 使用JDK动态代理

    public interface MyService {
        void doSomething();
    }
    
    public class MyServiceImpl implements MyService {
        @Override
        public void doSomething() {
            System.out.println("Real implementation of doSomething");
        }
    }
    
    public class App {
        public static void main(String[] args) {
            MyService target = new MyServiceImpl();
            MyService proxy = (MyService) ProxyFactory.createProxy(target);
            proxy.doSomething();
        }
    }
    

    4.2 使用CGLIB代理

    public class MyService {
        public void doSomething() {
            System.out.println("Real implementation of doSomething");
        }
    }
    
    public class App {
        public static void main(String[] args) {
            MyService target = new MyService();
            MyService proxy = (MyService) ProxyFactory.createProxy(target.getClass());
            proxy.doSomething();
        }
    }
    

    5. 总结

    通过本文,我们深入了解了Spring AOP是如何基于JDK动态代理和CGLIB代理技术实现的。通过详细的示例演示,希望读者能更清晰地理解Spring AOP的底层原理,并在实际项目中灵活应用这一强大的技术。

  • 相关阅读:
    【数据结构】二叉搜索树——二叉搜索树的概念和介绍、二叉搜索树的简单实现、二叉搜索树的增删查改
    人工智能机器学习-飞桨神经网络与深度学习
    虚拟DOM,diff
    读书笔记之《敏捷测试从零开始》(一)
    【PAT甲级】1005 Spell It Right
    基于elementui input完成的输入控件
    Java设计模式之策略模式
    思维导图制作工具推荐
    国内首家,极越展示纯视觉城市NOA,正面对决特斯拉FSD
    scanf和scanf_s函数详解
  • 原文地址:https://www.cnblogs.com/lyxlucky/p/17972992