大家好,我是IT修真院深圳分院的学员,一枚正直纯洁善良的JAVA程序员。本次为大家带来Spring的AOP的学习心得。
1.背景介绍
AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个核心内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2.知识剖析
AOP可以说是OOP(面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。
不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。
日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting)。
在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP的具体概念如下:
1、横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点。
2、切面(aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint):被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法.
4、切入点(pointcut):对连接点进行拦截的定义
5、通知(advice):所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象:代理的目标对象
7、织入(weave):将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段.
3.常见问题
1.面向切面编程(AOP),那我们说的切面到底是什么?
4.解决方案
1.到底是切什么呢?
切的是方法,是业务处理的流程。把一连串的方法切开,将流程断开。
2.切开做什么?
添加代码.在不影响源代码的前提下添加代码。断开流程之后,我们就可以在断开的地方添加日志来监控或者是添加代码来对程序进行增强。
3.如何添加代码
AOP有五种通知,分为:前置、后置、最终、异常、环绕。我们只需要在相应切开点添加上相应的通知,并为对应的通知添加上其相关的代码。
5.编码实战
6.扩展思考
基于注解与基于配置文件的优缺点
注解:是一种分散式的元数据,与源代码紧绑定。
xml:是一种集中式的元数据,与源代码无绑定。
注解的缺点:
1、很多朋友比如在使用spring注解时,会发现注解分散到很多类中,不好管理和维护;
2、注解的开启/关闭必须修改源代码,因为注解是源代码绑定的,如果要修改,需要改源码,有这个问题,所以如果是这种情况,还是使用XML配置方式;比如数据源;
3、注解还一个缺点就是灵活性,比如在之前翻译的Spring Framework 4.0 M1: WebSocket 支持;在实现复杂的逻辑上,没有XML来的更加强大;注解就是要么用,要么不用;
4、通用配置还是走XML吧,比如事务配置,比如数据库连接池等等,即通用的配置集中化,而不是分散化,如很多人使用@Transactional来配置事务,在很多情况下这是一种太分散化的配置;
5、XML方式比注解的可扩展性和复杂性维护上好的多,比如需要哪些组件,不需要哪些;在面对这种情况,注解扫描机制比较逊色,因为规则很难去写或根本不可能写出来;
注解的好处:
1、XML配置起来有时候冗长,此时注解可能是更好的选择,如jpa的实体映射;注解在处理一些不变的元数据时有时候比XML方便的多,比如springmvc的数据绑定,如果用xml写的代码会多的多;
2、注解最大的好处就是简化了XML配置;其实大部分注解一定确定后很少会改变,所以在一些中小项目中使用注解反而提供了开发效率,所以没必要一头走到黑;
3、注解相对于XML的另一个好处是类型安全的,XML只能在运行期才能发现问题。
注解也好,XML也好,我们还是需要一些开关/替换机制来控制特殊需求,以改变那种要么全部 要么没有的方案。。
7.参考文献
链接:http://blog.csdn.net/u010987379/article/details/52152925
作者:u010987379
链接:http://blog.csdn.net/onlylove_longshao/article/details/53560785
作者:OnlyLove_longshao
链接:https://www.cnblogs.com/yncx/p/5990774.html
作者:一怒成仙
8.更多讨论
1.什么是面向切面编程AOP?
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
2.前文提到jdk代理和cglib代理两种动态代理,优秀的spring框架把两种方式在底层都集成了进去,我们无需担心自己去实现动态生成代理。那么,spring是如何生成代理对象的?
如果有接口,则使用Jdk代理,反之使用Cglib。spring AOP综合两种代理方式的使用前提有会如下结论:如果目标类没有实现接口,且class为final修饰的,则不能进行spring AOP编程!
3.Spring AOP原理为什么用2种实现方式?JDKProxy和Cglib?
为什么不直接都使用JDK动态代理:
JDK动态代理只能代理接口类,所以很多人设计架构的时候会使用
XxxService, XxxServiceImpl的形式设计,一是让接口和实现分离,二是也有助于代理。
为什么不都使用Cgilb代理:
因为JDK动态代理不依赖其他包,Cglib需要导入ASM包,对于简单的有接口的代理使用JDK动态代理可以少导入一个包。
PPT链接:戳这里看PPT
腾讯视频:腾讯视频
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧
直接点击此链接:http://www.jnshu.com/login/1/10985551