2019独角兽企业重金招聘Python工程师标准>>>

什么是aop

AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

aop使用场景

aop框架种类

  • AspectJ
  • JBoss AOP
  • Spring AOP

使用aop可以做的事情有很多。

  • 性能监控,在方法调用前后记录调用时间,方法执行太长或超时报警。
  • 缓存代理,缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。
  • 软件破解,使用AOP修改软件的验证类的判断逻辑。
  • 记录日志,在方法执行前后记录系统日志。
  • 工作流系统,工作流系统需要将业务代码和流程引擎代码混合在一起执行,那么我们可以使用AOP将其分离,并动态挂接业务。
  • 权限验证,方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕捉。

观察一下传统编码方式与使用aop的区别

核心概念

描述AOP常用的一些术语有通知(Adivce)、切点(Pointcut)、连接点(Join point)、切面(Aspect)、引入(Introduction)、织入(Weaving)、通知(Advice)等。

简单例子

相比xml配置,基于注解的方式更加简洁方便。

@Aspect
public class TransactionDemo {@Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")public void point(){}@Before(value="point()")public void before(){System.out.println("transaction begin");}@AfterReturning(value = "point()")public void after(){System.out.println("transaction commit");}@Around("point()")public void around(ProceedingJoinPoint joinPoint) throws Throwable{System.out.println("transaction begin");joinPoint.proceed();System.out.println("transaction commit");}
}

在applicationContext.xml中配置。

<aop:aspectj-autoproxy />
<bean id = "transactionDemo" class = "com.yangxin.core.transaction.TransactionDemo" />

spring aop原理

通过前面介绍可以知道:AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异:AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。

Spring 的 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他 Bean 实例作为目标,这种关系可由 IoC 容器的依赖注入提供。

aop开发时,其中需要程序员参与的只有 3 个部分:

  • 定义普通业务组件。
  • 定义切入点,一个切入点可能横切多个业务组件。
  • 定义增强处理,增强处理就是在 AOP 框架为普通业务组件织入的处理动作。

为了理清关系,先来个类关系图。

两种动态代理方式

Spring默认采取的动态代理机制实现AOP,当动态代理不可用时(代理类无接口)会使用CGlib机制。

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。

JDK动态代理

  • JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。

  • Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。

CGLib动态代理

  • CGLib全称为Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口,CGLib封装了asm,可以再运行期动态生成新的class。和JDK动态代理相比较:JDK创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过CGLib创建动态代理。

知识拓展

通过上面的分析,大家是否有种熟悉的感觉,似乎和拦截器、过滤器的功能相似。那么问题来了,aop与拦截器、过滤器是什么关系。

先来回顾一下拦截器与过滤器。如下图一网友的测试,在web.xml中注册了TestFilter1和TestFilter2。然后在spring的配置文件中配置了BaseInterceptor和TestInterceptor。得到的结果如下图所示。从图中可以看出,拦截器和过滤器都横切了业务方法,看似符合aop的思想。

Filter过滤器:拦截web访问url地址。 Interceptor拦截器:拦截以 .action结尾的url,拦截Action的访问。 Spring AOP拦截器:只能拦截Spring管理Bean的访问(业务层Service)

写在最后

下篇文章将会写Spring cache的内容,同样以思维导图的方式编写。可视化学习,让java不再难懂。

最后的最后,欢迎关注我的微信公众号java思维导图,下载导图源文件,以及更多java思维导图与项目资料供你学习,带你走进记忆脑图的世界。

关注公众号并回复“思维导图”立即下载源xmind导图。

上篇文章阅读

  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Spring思维导图,让Spring不再难懂(ioc篇
  • Spring思维导图,让spring不再难懂(一)

转载于:https://my.oschina.net/u/3080373/blog/1503693

Spring思维导图,让Spring不再难懂(aop篇)相关推荐

  1. Spring思维导图,让Spring不再难懂(cache篇)

    转载自 Spring思维导图,让Spring不再难懂(cache篇) 关于缓存 缓存是实际工作中非常常用的一种提高性能的方法.而在java中,所谓缓存,就是将程序或系统经常要调用的对象存在内存中,再次 ...

  2. Spring思维导图,让Spring不再难懂(mvc篇)

    转载自 Spring思维导图,让Spring不再难懂(mvc篇) spring mvc简介与运行原理 Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的 ...

  3. Spring思维导图,让spring不再难懂(一)

    转载自 Spring思维导图,让spring不再难懂(一) 摘要: Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个 ...

  4. Spring思维导图,让Spring不再难懂(ioc篇)

    转载自 Spring思维导图,让Spring不再难懂(ioc篇) 写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建对象,而是从ioc容 ...

  5. Bean Definition到底是什么,附spring思维导图分享

    写在前面的话&&About me 网上写spring的文章多如牛毛,为什么还要写呢,因为,很简单,那是人家写的:网上都鼓励你不要造轮子,为什么你还要造呢,因为,那不是你造的. 我不是要 ...

  6. Spring 思维导图,让 Spring 不再难懂(cache篇)

    转载自: java思维导图   开源中国 关于缓存 缓存是实际工作中非常常用的一种提高性能的方法.而在java中,所谓缓存,就是将程序或系统经常要调用的对象存在内存中,再次调用时可以快速从内存中获取对 ...

  7. Spring思维导图(MVC篇)

    写在前面 生活就像海洋,只有意志坚强的人才能到达彼岸. 已经很久没有发文章了呀,想必大家都挂念我了,哈哈. 温故而知新,今天一起来复习一下spring mvc的内容吧. spring mvc简介与运行 ...

  8. Spring思维导图(IOC篇)

    写在前面 写过java的都知道:所有的对象都必须创建:或者说:使用对象之前必须先创建.而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对象. 就好像我们无需考虑对象的销毁回收一样 ...

  9. 免费的思维导图软件哪个好?这篇文章告诉你

      随着现在工作和生活节奏的加快,大家都在追求高效率高质量的做事方法,比如在与领导汇报年终报告的时候,只靠口头讲述,对方很难一下子接收到.若我们将输出的内容整理成思维导图的形式,边展示边讲述,对方就能 ...

最新文章

  1. Redis分布式锁【正确实现方式】
  2. 《从0到1学习Flink》—— Flink 读取 Kafka 数据批量写入到 MySQL
  3. Hystrix和ribbon的超时时长准确配置的理论依据
  4. 22 Notification 通知栏代码
  5. c#和WIN32 调用
  6. 从另一个角度看大数据量处理利器:布隆过滤器
  7. ModuleNotFoundError: No module named 'cv2'
  8. ApacheCN Pandas 教程集
  9. birt报表数据只有一条_这个低代码报表开发平台,操作类似Excel,用好了不需要加班...
  10. Windows10系统的MSDN下载和通过U盘进行安装的步骤(亲测有效)
  11. Java SE、OpenJDK、Java EE、Java 框架、Java ME 等概念之间的区别
  12. WPS2000系列之二样式管理(转)
  13. itx机箱尺寸_讲解 ATX M-ATX ITX 各种主板尺寸
  14. 怎么制作GIF图片并添加文字
  15. mac 回车键、空格键失灵(非物理原因)解决方法
  16. CodeForces 805C Find Amir
  17. python界面显示图片更换背景_用python制作一个简陋的证件照换底色的桌面控制台应用...
  18. python 算法测试结果自动保存到excel表格
  19. Element el-select 选择器(下拉框)详解
  20. R语言Excel的读写

热门文章

  1. 最新电子皮肤的触觉有多灵?连空气流动都能感受到
  2. 袖口里的“超能力”:Facebook腕带式AR传感器,可隔空打字、操控界面,LeCun点赞...
  3. NASA科学家联名求撤稿:金星有生命迹象是大乌龙,12阶多项式拟合不靠谱
  4. 双11背后的技术力量,阿里云神龙治愈云计算阿克琉斯之踵
  5. JavaScript内存优化
  6. tomcat work目录的作用就是编译每个项目里的jsp文件为java文件如果项目没有jsp页面则这个项目文件夹为空...
  7. Chapter 1 First Sight——14
  8. 推荐 查公司信息的一个网站
  9. Windbg 基础命令 《第一篇》
  10. Hibernate的配置文件 Hibernate.cfg.xml与xxx.hbm.xml