什么是AOP
面向切面编程,将多业务流程涉及的通用功能,如权限、日志、事务管理等抽取出来并单独封装,形成独立的切面;在适当的时机,将切面横向切入到业务流程指定的位置中。是对OOP面向对象编程的一种补充。
优点:可以降低各步骤之间的耦合性,且扩展功能时不需要对公共的逻辑处理。
使用场景
Authentication 权限
Authentication 权限、logging, tracing, profiling and monitoring 记录跟踪优化 校准、Transactions 事务、Resource pooling 资源池、Synchronization 同步、Caching 缓存、Context passing 内容传递、Error handling 错误处理Lazy loading懒加载、Debugging调试、Performance optimization 性能优化、Persistence 持久化。
把大象老虎塞进冰箱
把大象装进冰箱分三步:
(1)、打开冰箱
(2)、把大象装进冰箱 把老虎装进冰箱
(3)、关上冰箱
解决的几种思路方法:
1、可以写一个工具类,把重复的过程写工具类里
2、继承一个类,执行相同的方法
3、动态代理解决
4、AOP
AOP代理的实现技术
AspectJ
用一种AspectJ支持的特定语言编写切面,通过一个命令来编译,生成一个新的代理类。是在编译时增强,相对于下面说的运行时增强,编译时增强的性能更好。
Spring AOP
在运行期间对业务方法进行增强,不会生成新类。对于动态代理技术,Spring AOP提供了对JDK动态代理的支持以及CGLib的支持。
JDK动态代理只能为接口创建动态代理实例,利用JDK的反射机制,在运行时动态的生成代理对象并加载到JVM中,即编译完成后不存在class文件。
CGLib动态代理,不需要目标对象实现接口,可以防止代理类的侵入。把被代理对象类的class文件加载进来,修改其字节码生成子类。
常见的代理模式的对比
动态代理:在目标对象实现接口的前提下,利用JDK的反射机制,在运行时动态的生成代理对象并加载到JVM中,即编译完成后不存在class文件。
CGLIB代理:使用第三方类库动态的生成代理对象,不需要目标对象实现接口,可以防止代理类的侵入。
静态代理:代理对象和目标对象同实现一个接口,在代理对象中调用了目标对象的方法。使客户端对目标对象的调用,只能通过代理对象来实现。冗余,扩展时不易维护。
Spring AOP的关键名词
关系图
切面(Aspect)
AOP模块的核心,即切入业务流程的独立模块,如日志、事务、权限管理模块。在Spring AOP中,切面通过带有@Aspect注解的类实现。
通知(Advice)以及分类
即切面的具体实现方法,
前置通知(Before advice):执行方法之前的通知,不能阻止连接点的执行(除非该通知抛出异常)
最终通知(After advice):方法结束时的通知,不管是正常返回还是异常通知)、
后置通知(AfterReturning advice):方法正常结束时的通知
异常通知(AfterThrowing advice):方法抛出异常退出时的通知
环绕通知(Around advice):包围一个连接点的通知,可在方法调用前、正常返回、异常等时的通知。是最常用的一种通知类型。大部分基于拦截的AOP框架,例如Nanning和JBoss4,都只提供环绕通知。
可使用配置文件、注解指定。
连接点(Joinpoint)
业务流程在运行过程中需要插入切面的具体位置,即实际执行AOP的位置。
切入点(Pointcut)
即用于定义 Advice应该和哪些Joinpoint关联,如<aop:pointcut>
目标对象(Target Object)
被切面所通知的对象,即业务逻辑处理对象。这个对象永远是一个被代理(proxied)对象。
代理对象(Proxy Object)
目标对象被切入切面之后形成的对象,从客户端看目标对象和代理对象是一样的效果。
织入(Weaving)
将切面Aspect的对应的Advice,根据PointCut的配置,应用到应用程序对应的JoinPoint,从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行期。
配置文件示例