spring aop动态代理有哪些

fiy 其他 7

回复

共3条回复 我来回复
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring AOP(Aspect-Oriented Programming)是Spring框架提供的一种基于面向切面编程的技术,可以对现有的业务逻辑进行解耦和增强。在Spring AOP中,主要使用动态代理来实现切面的织入。下面是动态代理在Spring AOP中的几种常见实现方式:

    1. 基于JDK动态代理:Spring AOP默认使用JDK动态代理来创建代理对象。它基于接口进行代理,在运行时通过反射的方式动态生成代理类。通过实现InvocationHandler接口和Proxy类的静态方法newProxyInstance来实现代理。

    2. 基于CGLIB动态代理:当目标类没有接口时,Spring AOP会采用CGLIB动态代理来创建代理对象。CGLIB是一个强大的第三方动态字节码生成库,它通过生成目标类的子类来实现代理。在运行时通过字节码技术对目标类进行扩展,从而实现对目标类的代理。

    3. 基于Spring自带的ProxyFactoryBean:Spring还提供了一个ProxyFactoryBean类,它是一个工厂Bean,可以通过配置的方式来创建代理对象。该类可以根据配置使用JDK动态代理或CGLIB动态代理来生成代理对象。

    4. 基于注解的动态代理:Spring AOP还支持使用注解的方式来定义切面和切点,通过解析注解来实现动态代理。可以在方法或类上添加注解,通过配置切面和切点来实现代理。

    以上是Spring AOP中常见的动态代理实现方式。根据具体的需求和使用场景,可以选择合适的方式来实现对目标类的代理。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring AOP动态代理主要有以下几种方式:

    1. JDK动态代理:JDK提供了一个Proxy类和InvocationHandler接口,通过实现InvocationHandler接口并通过Proxy类创建代理对象。该代理对象可以调用目标类的方法,并在方法调用前后加入其他逻辑。JDK动态代理只能为接口创建代理对象,不能为类创建代理对象。

    2. CGLIB动态代理:CGLIB是一个强大的高性能代码生成库,通过继承目标类,并重写其方法来创建代理类。CGLIB动态代理能够为类创建代理对象,无需实现接口。

    3. Annotation注解:Spring AOP支持使用注解来定义切点和增强逻辑。通过在目标类的方法上加上特定的注解,可以将其切入点定义为注解,并在注解上指定增强逻辑所在的类或方法。

    4. XML配置:通过在XML配置文件中定义切点和增强逻辑的配置来实现动态代理。可以通过指定类的名称或者正则表达式来匹配目标类,并通过指定增强逻辑所在的类或方法来实现代理。

    5. AspectJ:AspectJ是一个功能强大的AOP框架,可以在编译器级别进行静态织入或者在运行时进行动态织入。它可以通过指定切点和增强逻辑的方式来实现动态代理。

    总结起来,Spring AOP动态代理主要包括JDK动态代理、CGLIB动态代理、Annotation注解方式、XML配置方式和AspectJ方式。根据具体的需求和情况,可以选择合适的方式来实现动态代理。

    1年前 0条评论
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring AOP动态代理主要有两种方式:JDK动态代理和CGLIB动态代理。

    1. JDK动态代理:
      JDK动态代理是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现的。使用JDK动态代理,被代理的类必须实现一个接口。

    JDK动态代理的步骤如下:

    1. 创建一个实现InvocationHandler接口的代理类,这个代理类负责实现具体的代理逻辑。
    2. 使用Proxy类的静态方法newProxyInstance()创建代理对象。需要传入一个ClassLoader对象、一个接口数组和InvocationHandler对象。
    3. 通过代理对象调用方法,实际上会调用InvocationHandler中的invoke()方法,在invoke()方法中完成具体的代理逻辑。

    示例代码:

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class JDKDynamicProxy implements InvocationHandler {
        private Object target; // 被代理的对象
    
        public JDKDynamicProxy(Object target) {
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            // 在代理方法前执行的逻辑
            System.out.println("Before method invocation");
    
            // 调用被代理对象的方法
            Object result = method.invoke(target, args);
    
            // 在代理方法后执行的逻辑
            System.out.println("After method invocation");
    
            return result;
        }
    
        public static void main(String[] args) {
            // 创建被代理的对象
            HelloService helloService = new HelloServiceImpl();
    
            // 创建代理对象
            HelloService proxy = (HelloService) Proxy.newProxyInstance(
                    helloService.getClass().getClassLoader(),
                    helloService.getClass().getInterfaces(),
                    new JDKDynamicProxy(helloService));
    
            // 调用代理对象的方法
            proxy.sayHello();
        }
    }
    
    1. CGLIB动态代理:
      CGLIB动态代理是通过继承被代理类来实现的。CGLIB底层使用ASM框架操作字节码,不需要被代理类实现接口。

    CGLIB动态代理的步骤如下:

    1. 创建一个继承被代理类的子类。
    2. 在子类中重写父类的方法,并在其中添加需要的代理逻辑。
    3. 使用Enhancer类创建代理对象。需要设置代理目标、父类、回调方法等。
    4. 调用代理对象的方法,实际上会调用父类中重写的方法,在其中完成具体的代理逻辑。

    示例代码:

    import net.sf.cglib.proxy.Enhancer;
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    
    import java.lang.reflect.Method;
    
    public class CGLIBDynamicProxy implements MethodInterceptor {
        private Object target; // 被代理的对象
    
        public CGLIBDynamicProxy(Object target) {
            this.target = target;
        }
    
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            // 在代理方法前执行的逻辑
            System.out.println("Before method invocation");
    
            // 调用被代理对象的方法
            Object result = proxy.invoke(target, args);
    
            // 在代理方法后执行的逻辑
            System.out.println("After method invocation");
    
            return result;
        }
    
        public static void main(String[] args) {
            // 创建被代理的对象
            HelloService helloService = new HelloServiceImpl();
    
            // 创建Enhancer对象
            Enhancer enhancer = new Enhancer();
    
            // 设置父类和回调方法
            enhancer.setSuperclass(helloService.getClass());
            enhancer.setCallback(new CGLIBDynamicProxy(helloService));
    
            // 创建代理对象
            HelloService proxy = (HelloService) enhancer.create();
    
            // 调用代理对象的方法
            proxy.sayHello();
        }
    }
    

    以上就是Spring AOP动态代理的两种方式:JDK动态代理和CGLIB动态代理。根据实际场景和需求选择合适的方式进行动态代理。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部