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

Spring AOP原来是这样实现的的更多相关文章

  1. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  2. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  3. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  4. spring aop注解方式与xml方式配置

    注解方式 applicationContext.xml 加入下面配置 <!--Spring Aop 启用自动代理注解 --> <aop:aspectj-autoproxy proxy ...

  5. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  6. Spring AOP详解

    一.前言 在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnbl ...

  7. Spring AOP实例——异常处理和记录程序执行时间

    实例简介: 这个实例主要用于在一个系统的所有方法执行过程中出线异常时,把异常信息都记录下来,另外记录每个方法的执行时间. 用两个业务逻辑来说明上述功能,这两个业务逻辑首先使用Spring AOP的自动 ...

  8. 从零开始学 Java - Spring AOP 实现用户权限验证

    每个项目都会有权限管理系统 无论你是一个简单的企业站,还是一个复杂到爆的平台级项目,都会涉及到用户登录.权限管理这些必不可少的业务逻辑.有人说,企业站需要什么权限管理阿?那行吧,你那可能叫静态页面,就 ...

  9. 从零开始学 Java - Spring AOP 实现主从读写分离

    深刻讨论为什么要读写分离? 为了服务器承载更多的用户?提升了网站的响应速度?分摊数据库服务器的压力?就是为了双机热备又不想浪费备份服务器?上面这些回答,我认为都不是错误的,但也都不是完全正确的.「读写 ...

  10. 从零开始学 Java - Spring AOP 拦截器的基本实现

    一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...

随机推荐

  1. vue-test ------事件监听

    <template> <h3>监听器</h3> <p>{{message}}</p> <button @click="upd ...

  2. pytest框架学习-测试用例发现机制以及用例执行命令

    pytest是什么 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但是比unittest框架使用起来更简洁,效率更高. Pytest安装 安装命令: ...

  3. C#/.NET/.NET Core优秀项目和框架2023年12月简报

    前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(公众号每周至少推荐两个优秀的项目和框架当然节假日除外),公众号推文有项目和框架的介绍.功能特点以及部分功能截图等(打不 ...

  4. OfficeWeb365任意文件读取

    OfficeWeb365任意文件读取 OfficeWeb365 /Pic/Indexs接口处存在任意文件读取漏洞,攻击者可通过独特的加密方式对payload进行加密,读取任意文件,获取服务器敏感信息, ...

  5. Pikachu漏洞靶场 URL重定向

    URL重定向 点击 我就是我,放荡不羁的我 可以发现url是这样的: http://192.168.171.30/pikachu/vul/urlredirect/urlredirect.php?url ...

  6. 笔记本为什么不出可升级CPU的,用台式CPU不行吗?

    我十几年年前的thinkpad 通过更换cpu复活了:联想ThinkPad E430c i3变i7:笔记本电脑CPU升级思路-CPU参数 为什么现在的市面上可以更换cpu的笔记本非常稀少呢? inte ...

  7. Unicode编码:打破语言壁垒,实现无缝交流

    Unicode编码是一种用于表示文本字符的编码系统,它旨在解决不同字符集之间相互兼容的问题,使各种语言和文化得以在数字世界中无缝交流.本文将从多个方面介绍Unicode编码的概念.原理及其在现实中的应 ...

  8. node.js 命令必须加 npx 才能执行

    问题描述 在 Windows 上搭建 Hexo 环境,已经从官网下载安装 node-v18.18.2-x64.msi,并且通过 npm 命令成功安装 hexo. PowerShell 中,直接执行 h ...

  9. Dio网络请求

    包 dio: ^4.0.0 http: ^0.13.3 dio_cookie_manager: ^2.0.0 cookie_jar: ^3.0.1 dio_http2_adapter: ^2.0.0 ...

  10. 云小课|MRS基础操作之配置DataNode容量均衡

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:当HDFS集群出现 ...