解耦利器之AOP

  • Spring的由来
  • 面向切面AOP
  • 横切关注点
  • Aspect切面
  • 通知Advice
  • 连接点JoinPoint
  • 切点Pointcut
  • Spring AOP实现方式


Spring的由来

完成一个有实际应用场景的功能,通常需要多个类相互协作完成,而类之间就必须保持着对各自需要的类的依赖关系(代码层级就是持有引用)。持有者需要自己维护繁重的依赖关系管理。这样就形成了强耦合。这种耦合关系到了企业级应用就是业务层和其他各层的耦合。spring应运而生,它的核心就是为了降低耦合。

面向切面AOP

DI让各组件保持松耦合,对象之间的解耦。AOP(aspect-oriented-programming)允许把分布在应用各处的功能分离出来,形成可重用的组件,横切关注点与它所影响对象之间的解耦。日志、事务处理、安全控制、异常处理等。

横切关注点

java解耦合 spring解耦的理解_动态代理


影响应用多处的功能。安全、事务、日志这些功能影响了注册、积分、结算多个模块。可以被模块化特殊的类,这些类被称为切面。

Aspect切面

封装横切关注点的类。

java解耦合 spring解耦的理解_java解耦合_02

通知Advice

切面的工作被称为通知。通知定义了切面要完成什么工作、什么时候做。






连接点JoinPoint

程序运行过程中的一些时间点。方法的调用、异常的抛出。Spring AOP中所有的方法执行都是连接点。

切点Pointcut

需要处理的链接点。切点是一个描述信息,缩小了切面通知链接点的范围。

Spring AOP实现方式

AOP实现依赖于代理。代理分为静态代理和动态代理。Spring依赖于AspectJ在编译时增强实现AOP,属于静态代理。也有基于JDK或者CGLIB的动态代理。Spring中它只是aspectJ的Annotation。可不要认为它是基于Aspect的代理。

  1. 基于接口的动态代理,也是JDK自带代理。
  2. 基于Cglib代理。

Spring AOP默认使用标准JDK动态代理。(由于面向接口而不是class编程,是良好实践;所以业务对象通常会实现一个或多个接口。)能够让让任何接口或者一组接口被代理。Spring AOP也会使用CGLIB代理。如果被代理类是class而不是接口,就必须强制使用CGLIB(希望这种情况很少。也是希望大家尽量使用面向接口编程)。