Spring AOP应用场景你还不知道?这篇一定要看!
2024-09-01 19:17:25
回顾一下Spring AOP的知识
为什么会有面向切面编程(AOP)?
我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
Spring AOP 中设计的一些核心知识,面试问题?
1、能说一下Spring AOP用的是哪种设计模式?
回答:代理模式。
2、 能简单聊一下你对代理模式的理解吗?
代理模式 balabala......,记住一些贴近日常的示例方便理解,如买火车票,Windows 里面的快捷方式...
3、 知道JDK代理和Cglib代理有什么区别?
我们不需要创建代理类,JDK 在运行时为我们动态的来创建,JDK代理是接口 balabala
若目标类不存在接口,则使用Cglib生成代理,balabala
不管是JDK代理还是Cglib代理本质上都是对字节码进行操作,balabala
4、让你实现一个JDK实现动态代理?你的思路是什么?
照葫芦画瓢,照猫画虎。
Proxy: 定义一个自己的Proxy类
InvocationHandler:定义一个自己的InvocationHandler类
ClassLoad:自定义类加载器(方便加载我们自己指定的路径下面的类)
上面简单回顾,并抛出一些问题。带着问题阅读,效果杠杠的。
回到本文的重点
SpringAOP的在实际应用中场景有哪些?
- Authentication 权限
- Caching 缓存
- Context passing 内容传递
- Error handling 错误处理
- Lazy loading 懒加载
- Debugging 调试
- logging,tracing,profiling and monitoring 记录跟踪 优化 校准
- Performance optimization 性能优化
- Persistence 持久化
- Resource pooling 资源池
- Synchronization 同步
- Transactions 事务
- Logging 日志
以日志为例
假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如
但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。
但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。
通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置
插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。
为了在指定位置执行这些横向的功能,需要知道指定的是什么地方。
例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是:
- Before(前置通知) 目标方法调用之前执行
- After(后置通知) 目标方法调用之后执行
- After-returning(返回通知) 目标方法执行成功后执行
- After-throwing(异常通知) 目标方法抛出异常后执行
- Around(环绕通知) 相当于合并了前置和后置
把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:
@Aspect @Component public class HelloAspect { @Before("execution(* com.test.service.impl.HelloServiceImpl.sayHello(..))") public void sayHello(){ System.out.println("hello Java编程技术乐园!"); } }
使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下:
第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,星号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是sayHello,则是指定了该类中的sayHello方法。然后最后一个参数是方法入参,因为Java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。
总结
我们使用spring aop,有两点需要注意:
1、将切面类声明为一个bean
2、切点指定的方法所在的类也同样需由spring注入才能生效
最新文章
- Excel——OFFSET函数
- Java提高篇(三四)-----fail-fast机制
- salesforce 零基础学习(三十九) soql函数以及常量
- EasyUi 改变 selelct 的 下拉内容 div 的高度
- iOS--SDAutolayout宽度自适应
- js实现按回车自行提交
- mysql 刘道成视频教程 第3课
- 编写自己的C头文件
- mapper分页排序指定字段查询模板
- ELK菜鸟手记 (三) - X-Pack权限控制之给Kibana加上登录控制以及index_not_found_exception问题解决
- Mqtt服务器搭建
- Mysql使用小tips
- DWR第五篇之文件上传
- spring中的aop演示
- 微信开发创业交流QQ群列表
- JedisClusterMaxRedirectionsException: Too many Cluster redirections
- 微信小程序开发资料汇总
- java学习笔记-JavaWeb篇二
- P1776 宝物筛选_NOI导刊2010提高(02)&;&; 多重背包二进制优化
- docker swarm实现java项目的发布/滚动更新/回滚/镜像管理
热门文章
- 力扣(LeetCode)按奇偶排序数组II 个人题解
- 力扣(LeetCode)缺失数字 个人题解
- 利用 pyhon 解决 Cross Origin Requests
- 【原】android【手机】屏幕适配解决方案,完美适配适配hdpi,xhdpi,xxhdpi的做法。
- 构建之法组——“别吃错喽”微信小程序评价
- Docker (一) 安装 Oracle18c
- 2019-10-16:渗透测试,基础学习,burpsuit学习,爆破的四种方式学习
- oracle内存占用过高和修改不当无法启动oracle实例的解决办法
- Redis高可用演进(一)
- [折腾笔记] 洛谷P1149-火柴棒等式 AC记