返回介绍

Spring 本质系列(2)-AOP

发布于 2025-01-22 00:38:52 字数 1191 浏览 0 评论 0 收藏 0

据说有些词汇非常热门和神奇, 如果你经常把它挂在嘴边,就能让自己功力大涨, 可以轻松找到理想的高薪的工作 :-)

这些词就包括上一篇文章(《Spring 本质系列(1) --依赖注入》) 中聊过的 IoCDI , 也包括今天要聊的 AOP

AOP(Aspect Oriented Programming)就是面向切面的编程, 为什么是面向切面, 而不是面向对象呢?

(提示:如果你对设计模式不太熟, 可以跳过下文中的第 2 和第 3 节)

1 问题来源 我们在做系统设计的时候,一个非常重要的工作就是把一个大系统做分解, 按业务功能分解成一个个低耦合、高内聚的模块,就像这样: 注意:现在 Transaction 这个类和业务类在源代码层次上没有一点关系,完全隔离了。

隔离是一件好事情, 但是马上给我们带来了大麻烦 。 Java 是一门静态的强类型语言, 代码一旦写好, 编译成 java class 以后 ,可以在运行时通过反射(Reflection)来查看类的信息, 但是想对类进行修改非常困难。

而 AOP 要求的恰恰就是在不改变业务类的源代码(其实大部分情况下你也拿不到)的情况下, 修改业务类的方法,进行功能的增强,就像上面给所有的业务类增加事务支持。

为了突破这个限制,大家可以说是费尽心机, 现在基本是有这么几种技术:

(1) 在编译的时候, 根据 AOP 的配置信息,悄悄的把日志,安全,事务等“切面”代码 和业务类编译到一起去。

(2) 在运行期,业务类加载以后, 通过 Java 动态代理技术为业务类生产一个代理类, 把“切面”代码放到代理类中, Java 动态代理要求业务类需要实现接口才行。

(3) 在运行期, 业务类加载以后, 动态的使用字节码构建一个业务类的子类,将“切面”逻辑加入到子类当中去, CGLIB 就是这么做的。

Spring 采用的就是(1) +(2) 的方式,限于篇幅,这里不再展开各种技术了, 不管使用哪一种方式, 在运行时,真正干活的“业务类”其实已经不是原来单纯的业务类了, 它们被 AOP 了 !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文