11 | 剑走偏锋:面向切面编程
四火
该思维导图由 AI 生成,仅供参考
你好,我是四火。
今天我们要接触一个和 MVC 密切相关的,能带来思维模式改变的编程范型——面向切面编程(AOP,Aspect Oriented Programming)。
“给我一把锤子,满世界都是钉子”
我记得曾经有这样一个相当流行的观点,是说,编程语言只需要学习一门就够了,学那么多也没有用,因为技术是一通百通的,别的编程语言可以说是大同小异。我相信至今抱有这种观点的程序员也不在少数。
可惜,事实远没有那么美好。这个观点主要有两处值得商榷:
其一,不同的技术,在一定程度上确实是相通的,可是,技术之间的关联性,远不是“一通百通”这四个简简单单的字能够解释的。妄想仅仅凭借精通一门编程语言,就能够自动打通其它所有编程语言的任督二脉,这是不现实的。
其二,通常来说,说编程语言大同小异其实是很不客观的。编程语言经过了长时间的发展演化,如今已经发展出非常多的类型,用作编程语言分类标准之一的编程范型也可谓是百花齐放。
因此我们要学习多种编程语言,特别是那些能带来新的思维模式的编程语言。现在,把这个观点泛化到普遍的软件技术上,也一样适用。我们都知道要“一切从实际出发”,都知道要“具体问题具体分析”,可是,在眼界还不够开阔的时候,特别是职业生涯的早期,程序员在武器库里的武器还非常有限的时候,依然无法避免“给我一把锤子,满世界都是钉子”,在技术选择的时候眼光相对局限。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了面向切面编程(AOP)和控制反转(IoC)的概念及其在Spring框架中的应用。AOP通过横切关注点分离,实现对代码的额外行为增强,而无需修改业务主体代码,提高了代码的模块性和可维护性。在Spring中,AOP可以通过动态代理实现,通过预先创建或运行时创建的代理类来完成切面功能。控制反转则是一种设计思想,通过将对象的创建和管理交给Spring容器来实现,从而实现了对象之间的松散耦合。文章还介绍了IoC的两种实现方式:依赖查找和依赖注入。最后,通过一个实践案例展示了AOP的运行时动态代理的实现方式。总的来说,本文通过实例和代码片段详细介绍了AOP和IoC的概念、应用和实现原理,为读者提供了全面的了解和学习指导。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《全栈工程师修炼指南》,新⼈⾸单¥59
《全栈工程师修炼指南》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(10)
- 最新
- 精选
- 不记年要说AOP的缺点的话,代码会变得不直观,需要脑补运行过程。不易调试,因为代码变得不直观,断点有时都不知道打在哪里。如果多层嵌套的话,上面的问题会加倍~
作者回复: 👍
2019-10-119 - Kevin·程远离代码开发工作10来年年了,利用以前的积累,这节课听了两遍,总算对mvc和aop、ioc有所感觉了,老师的讲解和分析很到位,很清晰,让我这样的也能搞明白。但是细细想来,所谓万变不离其宗,有根基才能了解上层的东西。对于spring的ioc,实施DI应该是提前完成底层资源对象的初始化工作,节省运行时调用的时间开销,简化主代码逻辑。这也需要丰厚的内存资源的支撑吧。另外spring会把所有对象提前装载到内存中吗,还是基于一定策略进行部分对象装载呢?
作者回复: 都有,对象的装载有几种方式,是不是“提前”装载还取决于lazyload的配置。
2020-04-042 - Demon.Lee“因为Spring基于动态代理,所以Spring只支持方法连接点。这与一些其他的AOP框架是不同的,例如AspectJ和JBoss,除了方法切点,它们还提供了字段和构造器接入点。Spring缺少对字段连接点的支持,无法让我们创建细粒度的通知,例如拦截对象字段的修改。而且它不支持构造器连接点,我们就无法在bean创建时应用通知。” 摘录自《Spring 实战》第4版,想请问老师,为啥基于动态代理就只能支持方法连接点,而其他的(如AspectJ)则可以支持构造器和字段接入点,不是特别理解,谢谢。
作者回复: 我的理解是,这和这两者的实现机制有关。动态代理它的实现本质上就是反射,字节码是不变的,因此这个限制是跑在JVM上的Java语言本身的限制;而静态织入则可以在编译期介入,直接改变字节码的生成,一般来说后者要强得多。
2021-03-191 - 老沈前端部分的 生命周期。路由钩子等是否参考了aop的设计呢。
作者回复: 从AOP的角度来理解确实是没问题的,但是最早是否参考了它的设计我就不清楚了。
2021-05-02 - szWestCGLIB不应该是编译时增强吗?
作者回复: 是运行时
2020-01-15 - Dream.没接触过Spring,很多地方都没看懂再说什么 比如xml配置后执行顺序为(1) → (4) → (0) → (5) → (2) 没看到(0)在哪里,这个顺序是怎么来的看了好几遍也没看懂
作者回复: 这里介绍的是配置切面逻辑以后的实际执行过程,(0) 就是原始代码,在你看到的(1) - (5) 的代码块的上方。
2019-10-09 - skyiOS里用的runtime的一些方法也是aop了
作者回复: 👍
2019-10-05 - 小寞子。(≥3≤)写过安卓开发。。在spring的时候遇到aop代理问题。。第一次听到这个概念。。 当时还不知道我用了半年的安卓开发里面很多功能实现其实就是aop。 一查才知道是什么。2019-11-24
- anginiit今年的项目都是springboot架构的,直接使用aop的就是写过一个用户操作日志记录,就是通过切面来拦截用户请求然后把用户信息记录下来的,没有特别深的使用过呢。不过原理已经明白了。2019-10-10
- pyhhou1. 之前没怎么了解过 AOP,到时 DI 这个概念倒是一直听到,但也就是知道个概念,今天算是弄清楚 AOP、IoC、DI 这几个东西的基本概念了 2. 从我个人角度来看,AOP 确实隐藏了资源层的一些实现,程序员只需要关注业务层的代码,不需要特别考虑资源访问的逻辑,但是如果资源层的实现出现了问题,在 AOP 的架构下,会增加一定的 debug 难度,因为在这种架构下,资源层的逻辑可以说是不透明的;另外就是 AOP 其实和一般的设计思想有点不太一样,使用和适应上会有一定的门槛吧;性能方面的话,动态 AOP 实现会影响代码的实际运行效率,静态 AOP 实现又相对比较复杂,这也是一个需要权衡的地方2019-10-10
收起评论