首页 > 其他分享 >Spring AOP原来是这样实现的

Spring AOP原来是这样实现的

时间:2024-01-20 13:22:42浏览次数:26  
标签:target Spring Object 代理 proxy AOP 原来 public

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的底层原理,并在实际项目中灵活应用这一强大的技术。

标签:target,Spring,Object,代理,proxy,AOP,原来,public
From: https://www.cnblogs.com/lyxlucky/p/17972992

相关文章

  • Java21 + SpringBoot3集成WebSocket
    目录前言相关技术简介什么是WebSocketWebSocket的原理WebSocket与HTTP协议的关系WebSocket优点WebSocket应用场景实现方式添加maven依赖添加WebSocket配置类,定义ServerEndpointExporterBean定义WebSocketEndpoint前端创建WebSocket对象总结前言近日心血来潮想做一个开源项目,目......
  • spring--Bean的生命周期
    Springbean的生命周期涉及多个阶段,从创建到销毁。下面是一个简化的生命周期描述:Bean定义:首先,Spring根据配置(XML、注解或Java配置)创建一个bean的定义。Bean实例化:Spring容器使用构造器或工厂方法实例化bean。属性填充:Spring容器通过反射机制,将所有......
  • spring--是如何解决单例模式下循环依赖问题的
    Spring解决单例bean的循环依赖主要依赖于容器的三级缓存机制,以及bean的提前暴露。这里是它如何工作的:三级缓存:一级缓存(singletonObjects):存储已经经过完整生命周期处理的单例bean,包括初始化和依赖注入等。二级缓存(earlySingletonObjects):存储早期的单例对象的引用,这些......
  • spring--@Autowired @Qualifier @Resource @Value 四者的区别
    @Autowired,@Qualifier,@Resource,和@Value是Spring框架中用于依赖注入的注解,它们各有特点和用途:@Autowired:@Autowired注解用于自动装配Spring容器中的bean。它默认按类型(byType)进行依赖注入。当存在多个同类型的bean时,它可以和@Qualifier注解一起使用,以指定注入......
  • 冷泉港实验室 (The Cold Spring Harbor Laboratory)
    冷泉港实验室(TheColdSpringHarborLaboratory)又译为科尔德斯普林实验室,是一个非盈利的私人科学研究与教育中心,位于美国纽约州长岛上的冷泉港,此机构的研究对象包括癌症、神经生物学、植物遗传学、基因组学以及生物资讯学,其主要成就为分子生物学领域,在该研究所一共诞生了7......
  • SpringBoot引入SpEL,优雅控制复杂权限!
    对于在Springboot中,利用自定义注解+切面来实现接口权限的控制这个大家应该都很熟悉,整体来说思路如下:自定义一个权限校验的注解,包含参数value配置在对应的接口上定义一个切面类,指定切点在切入的方法体里写上权限判断的逻辑然而,在实际的开发中,对于权限校验的需求场景是很多的,比如:傻眼......
  • springmvc与ajax相互调用, 2.springmvc中如何拦截get请求
    通过JACKson框架可以把java里面的对象转化成js可以识别的json对象。具体步骤:1.加入Jack.jar2.在配置文件配置json映射3.在接受ajax方法里面一颗直接返回OBject,list等,但方法加@ResponseBody注解。  @RequestMapping注解中加上method=RequestMethod.GET参数就可以实现拦......
  • springboot项目中的一些小tips
    1.服务出现类不是java,左下角是红色"J"解决方式:选择java包右键,MarkDirectoryas=>SourcesRoot2.myBatisX插件推荐方便mapper和xml之间的对应,还可以生成代码,推荐文章:初步使用:https://blog.csdn.net/weixin_47025166/article/details/125362323进阶使用:https://baomidou.c......
  • SpringBoot使用Feign进行服务间通信
    一、前言在分布式系统中,服务间通信是非常常见的情况。Feign是一个开源的JavaHTTP客户端,可以帮助我们在SpringBoot应用中快速构建和使用HTTP客户端,方便实现服务间的通信。与其他HTTP客户端相比,Feign具有简化HTTPAPI定义、支持多种HTTP请求方法、支持请求和响应的压缩、支持请求和......
  • SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver、postgresql)手动切换
    场景SpringBoot+MybatisPlus+dynamic-datasources实现连接Postgresql和mysql多数据源:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135653227上面实现通过注解和配置文件的方式去进行多数据源操作。如果业务需求,比如查询第三方接口时提供的是sqlserver的视图连......