全栈工程师修炼指南
熊燚(四火)
Oracle 首席软件工程师
32206 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 46 讲
全栈回顾 (1讲)
加餐 (1讲)
全栈工程师修炼指南
15
15
1.0x
00:00/00:00
登录|注册

11 | 剑走偏锋:面向切面编程

Spring AOP 默认支持运行期间的动态代理
依靠预先创建或运行时创建的代理类来完成切面功能
需要特定的编译器将 AspectJ 的代码编译成 JVM 可识别的 class 文件
面向切面的 Java 语言扩展
AspectJ 的扩展的语法语义
静态织入和动态代理比较的文章
Spring 官方文档
创建代理对象,在对原对象的方法调用前后添加额外逻辑
使用 JDK 的动态代理技术实现
依赖查找(DL)和依赖注入(DI)两种方式
通过 Spring 容器负责对象的查找、匹配、创建、装配、依赖管理
通过 XML 配置将原方法和 AOP 的切面功能连接起来
运行期间的动态代理
编译期间的静态织入
目标是增强代码模块性,解耦代码
通过横切关注点分离来增强代码模块性的方法
扩展阅读
实践 AOP 的运行时动态代理
控制反转 IoC
Spring 中的应用
实现原理
概念
面向切面编程(AOP)

该思维导图由 AI 生成,仅供参考

你好,我是四火。
今天我们要接触一个和 MVC 密切相关的,能带来思维模式改变的编程范型——面向切面编程(AOP,Aspect Oriented Programming)。

“给我一把锤子,满世界都是钉子”

我记得曾经有这样一个相当流行的观点,是说,编程语言只需要学习一门就够了,学那么多也没有用,因为技术是一通百通的,别的编程语言可以说是大同小异。我相信至今抱有这种观点的程序员也不在少数。
可惜,事实远没有那么美好。这个观点主要有两处值得商榷:
其一,不同的技术,在一定程度上确实是相通的,可是,技术之间的关联性,远不是“一通百通”这四个简简单单的字能够解释的。妄想仅仅凭借精通一门编程语言,就能够自动打通其它所有编程语言的任督二脉,这是不现实的。
其二,通常来说,说编程语言大同小异其实是很不客观的。编程语言经过了长时间的发展演化,如今已经发展出非常多的类型,用作编程语言分类标准之一的编程范型也可谓是百花齐放。
因此我们要学习多种编程语言,特别是那些能带来新的思维模式的编程语言。现在,把这个观点泛化到普遍的软件技术上,也一样适用。我们都知道要“一切从实际出发”,都知道要“具体问题具体分析”,可是,在眼界还不够开阔的时候,特别是职业生涯的早期,程序员在武器库里的武器还非常有限的时候,依然无法避免“给我一把锤子,满世界都是钉子”,在技术选择的时候眼光相对局限。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了面向切面编程(AOP)和控制反转(IoC)的概念及其在Spring框架中的应用。AOP通过横切关注点分离,实现对代码的额外行为增强,而无需修改业务主体代码,提高了代码的模块性和可维护性。在Spring中,AOP可以通过动态代理实现,通过预先创建或运行时创建的代理类来完成切面功能。控制反转则是一种设计思想,通过将对象的创建和管理交给Spring容器来实现,从而实现了对象之间的松散耦合。文章还介绍了IoC的两种实现方式:依赖查找和依赖注入。最后,通过一个实践案例展示了AOP的运行时动态代理的实现方式。总的来说,本文通过实例和代码片段详细介绍了AOP和IoC的概念、应用和实现原理,为读者提供了全面的了解和学习指导。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《全栈工程师修炼指南》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • 不记年
    要说AOP的缺点的话,代码会变得不直观,需要脑补运行过程。不易调试,因为代码变得不直观,断点有时都不知道打在哪里。如果多层嵌套的话,上面的问题会加倍~

    作者回复: 👍

    2019-10-11
    9
  • Kevin·程
    远离代码开发工作10来年年了,利用以前的积累,这节课听了两遍,总算对mvc和aop、ioc有所感觉了,老师的讲解和分析很到位,很清晰,让我这样的也能搞明白。但是细细想来,所谓万变不离其宗,有根基才能了解上层的东西。对于spring的ioc,实施DI应该是提前完成底层资源对象的初始化工作,节省运行时调用的时间开销,简化主代码逻辑。这也需要丰厚的内存资源的支撑吧。另外spring会把所有对象提前装载到内存中吗,还是基于一定策略进行部分对象装载呢?

    作者回复: 都有,对象的装载有几种方式,是不是“提前”装载还取决于lazyload的配置。

    2020-04-04
    2
  • Demon.Lee
    “因为Spring基于动态代理,所以Spring只支持方法连接点。这与一些其他的AOP框架是不同的,例如AspectJ和JBoss,除了方法切点,它们还提供了字段和构造器接入点。Spring缺少对字段连接点的支持,无法让我们创建细粒度的通知,例如拦截对象字段的修改。而且它不支持构造器连接点,我们就无法在bean创建时应用通知。” 摘录自《Spring 实战》第4版,想请问老师,为啥基于动态代理就只能支持方法连接点,而其他的(如AspectJ)则可以支持构造器和字段接入点,不是特别理解,谢谢。

    作者回复: 我的理解是,这和这两者的实现机制有关。动态代理它的实现本质上就是反射,字节码是不变的,因此这个限制是跑在JVM上的Java语言本身的限制;而静态织入则可以在编译期介入,直接改变字节码的生成,一般来说后者要强得多。

    2021-03-19
    1
  • 老沈
    前端部分的 生命周期。路由钩子等是否参考了aop的设计呢。

    作者回复: 从AOP的角度来理解确实是没问题的,但是最早是否参考了它的设计我就不清楚了。

    2021-05-02
  • szWest
    CGLIB不应该是编译时增强吗?

    作者回复: 是运行时

    2020-01-15
  • Dream.
    没接触过Spring,很多地方都没看懂再说什么 比如xml配置后执行顺序为(1) → (4) → (0) → (5) → (2) 没看到(0)在哪里,这个顺序是怎么来的看了好几遍也没看懂

    作者回复: 这里介绍的是配置切面逻辑以后的实际执行过程,(0) 就是原始代码,在你看到的(1) - (5) 的代码块的上方。

    2019-10-09
  • sky
    iOS里用的runtime的一些方法也是aop了

    作者回复: 👍

    2019-10-05
  • 小寞子。(≥3≤)
    写过安卓开发。。在spring的时候遇到aop代理问题。。第一次听到这个概念。。 当时还不知道我用了半年的安卓开发里面很多功能实现其实就是aop。 一查才知道是什么。
    2019-11-24
  • anginiit
    今年的项目都是springboot架构的,直接使用aop的就是写过一个用户操作日志记录,就是通过切面来拦截用户请求然后把用户信息记录下来的,没有特别深的使用过呢。不过原理已经明白了。
    2019-10-10
  • pyhhou
    1. 之前没怎么了解过 AOP,到时 DI 这个概念倒是一直听到,但也就是知道个概念,今天算是弄清楚 AOP、IoC、DI 这几个东西的基本概念了 2. 从我个人角度来看,AOP 确实隐藏了资源层的一些实现,程序员只需要关注业务层的代码,不需要特别考虑资源访问的逻辑,但是如果资源层的实现出现了问题,在 AOP 的架构下,会增加一定的 debug 难度,因为在这种架构下,资源层的逻辑可以说是不透明的;另外就是 AOP 其实和一般的设计思想有点不太一样,使用和适应上会有一定的门槛吧;性能方面的话,动态 AOP 实现会影响代码的实际运行效率,静态 AOP 实现又相对比较复杂,这也是一个需要权衡的地方
    2019-10-10
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部