·AOP(Aspect-Oriented Programming:面向切面编程):将那些与业务无关,却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为“切面”( Aspect ),便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性;
AOP的作用:AOP可以拦截指定的方法,并且对方法增强,比如:事务、日志、权限、性能监测等增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。
AOP的组成:
AOP由连接点,切点和通知组成
-
连接点(Joinpoint):程序中能够被切面插入的点,典型的连接点包括方法调用、方法执行过程中的某个时点等等。
-
通知(Advice):在连接点处执行的代码。通知分为各种类型,如前置通知、后置通知、环绕通知,异常通知。
-
切点(Pointcut):用于定义哪些连接点上应该应用通知。切点通过表达式进行定义,如匹配所有 public 方法或匹配某个包下的所有方法等。
Spring AOP 基于动态代理实现:
如果被代理的对象,已经实现某个接口,则 Spring AOP 会使用 JDK Proxy (反射),
基于接口的方式,创建代理对象(JDK 动态代理的核心是InvocationHandler 接口和 Prox
y类);
如果被代理的对象,没有实现某个接口,就无法使用 JDK Proxy 去进行代理了,这时候 Spri
ng AOP 会使用 cglib,基于继承的方式,生成一个被代理对象的子类来作为代理( cgli
b 动态代理的核心是 MethodInterceptor 接口和 Enhancer 类);