AOP
即Aspect Oriented Programming
,面向切面编程,AOP呢是通过分离应用的业务逻辑与系统级服务代码,达到职责拆分,功能提取,即高内聚的一个目的,应用对象只关注它们应该做的,即业务逻辑,而非业务相关的代码,如记录日志或事物支持等,脱离主业务代码,抽离成一个单独的切面类,从而在代码运行时动态地嵌入到我们的代码中,以实现编写时代码拆分,代码高内聚,运行时代码整合,功能保证齐全的目的。
实例: 在一个业务系统中,用户登录是一个基础功能,凡是涉及到用户的业务流程都要求登录,如果把登录功能代码写入到每一个业务流程中,就会显得代码的冗余,维护的时候也是很麻烦的。最好的办法就是吧代码抽离出来,形成独立的模块(拦截器),当业务流程需要的时候,系统会把登录功能自动切入到业务中,这就是一个AOP的体现 。
AOP
是spring
提供的关键特性之一。AOP即是面向切面编程,是OOP
编程的有效补充。使用AOP
技术,可以将一些系统性相关的编程工作,独立提取出来,然后通过切面进入系统,从而避免在业务逻辑代码的中混入很多的系统相关的逻辑–比如权限控制、事务管理、日志记录等等。这些系统的编程工作可以通过独立的代码实现,然后通过AOP
技术切入系统既可以。从而到达了讲不同的关注点分类出来的效果。
AOP
分为静态AOP
和动态AOP
。静态AOP
指的是Aspect
实现的AOP
,他是将切面代码直接编译到java
类文件中。动态AOP是将切面代码进行动态织入实现的AOP
。spring
的AOP
为动态AOP
,实现的技术为:JDK
提供的动态代理结束和CGLIB
(动态字节码增强技术)。尽管实现的技术不一样,但都是基于动态代理模式。都是生成一个代理对象。
就是在开发的工程中 专一开发就行 最后交由spring
进行代码增强
代理是一种设计模式,提供了简介对目标对象进行访问的方式,即通过代理对象访问目标对象,这样的好处是:可以在目标对象实现的功能上,增加额外的功能补充,即扩展目标对象的功能。
这就符合了设计模式的开闭原则,即在对既有的代码不改动的情况下进行功能的扩展。
如果目标对象为接口使用JDK代理 否则使用CGLIB
代理