AOP的前提知识:
JDK动态代理的缺点:被代理类必须实现接口。
CGLIB代理:不实现接口,直接对java类进行代理。
CGLIB动态代理的实现需要实现MethodInterceptor接口,重写Intercept方法。
面向切面编程(AOP)是一种编程技术。AOP联盟提供的底层API可以使得各个AOP实现工具之间实现相互兼容。与AOP相关的技术,如通用代理,拦截器,或字节码转换器。
- AspectJ:一个面向切面的框架,扩展了java语言。
AOP的基本概念:
AOP(Aspect Oriented Programming)是OOP(Object Oriented Programming)面向对象编程的一种补充和完善。OOP的面向对象对每个对象的行为进行归纳和划分,实现了抽象。但是,不同对象间的共性却不适合用面向对象编程方式实现,比如学生对象和汽车对象,都需要监控,与自身核心业务逻辑无关,如果用面向对象,就是让学生和汽车对象都集成监控接口,分别实现监控方法,但是不同对象的监控逻辑实现基本相同,都是监控某个时间发生了什么事,只是记录的对象不同,这会导致监控对象行为的逻辑代码散落在系统的各个地方。这样的设计会导致大量重复代码,并且不利于模块复用。
- AOP解决这个问题,提供横向切面逻辑,将与多个对象有关的公共模块分装成一个可重用模块,并将这个模块整合成Aspect(切面)。切面就是对与具体业务逻辑无关,却是许多业务模块共同特性或职责的一种抽象,减少了系统中的重复代码,降低了模块的耦合度,更加有利于扩展。 AOP将软件系统分为两部分:核心逻辑和横切逻辑。
Spring AOP相关概念:
- 横切关注点
- 切面Aspect
- 连接点JoinPoint:表示一个方法的执行。
- 切入点Point Cut:是匹配连接点的拦截规则。切入点表达式如何与连接点匹配是AOP的核心。Spring默认使用AspectJ切入点语法。
- 通知Advice:在切面上拦截到某个特定的连接点之后的工作。
- 目标对象Target Object:被一个或多个切面所通知的对象,即业务中需要增强的对象。
- 织入Weaving:是把切面作用到目标对象,然后产生一个代理对象的过程。
- 引入Introduction:是用来在运行时给一个类声明额外的方法或属性,即不需要为类实现一个接口,就能使用接口中的方法。
Spring AOP的实现:
实现方式:
- 基于JDK动态代理的实现:两种方式:XML配置文件;注解。
- 基于CGLIB的动态代理实现
增强类型:
按照增强(增强就是方法执行)在目标类方法中的连接点位置分为:
前置增强before
后置 after
环绕增强:在目标方法执行前后实施增强。
异常抛出增强:在目标方法抛出异常后实施增强。
引介增强:表示目标类中添加一些新的方法和属性。
切入点类型
切入点是匹配连接点的拦截规则。
Spring实现AOP编程
是以AspectJ相关注解方式实现AOP编程。
AspectJ是一个面向切面的框架,其可以生成遵循Java字节码规范的class文件。
@Aspect注解表示一个切面(实际上就是实现这个的类)
@PointCut注解表示切入点
@Before 前置通知
@Around环绕通知
@AfterReturning 后置通知
@AfterThrowing 异常通知
Spring AOP实现原理
Spring AOP的实现是通过创建目标对象的代理类,并对目标对象进行拦截来实现。
、