Spring AOP
AOP, Aspect Oriented Programming, 面向切面编程。它是OOP的一种有效补充。
AOP与OOP一样,是一种编程的理念,而 AspectJ组件是实现了AOP理念的,SpringAOP整合了aspectJ组件,所以,SpringAOP 可以帮助我们改进代码,它能够在不改变原有业务逻辑的基础上,动态地给目标代码添加“新的功能",而这些功能就是“切面”, 这种编程的思考模式就是 面向切面编程。
一般是“共性”的辅助性功能,做成“切面”,如:日志, 安全,认证,授权,事务等等。
Spring AOP的核心概念
-
Aspect, 切面,它是AOP的核心概念,不是业务逻辑,而是共性,它相当于 Advice + Pointcut
-
Advice, 通知,它是指切面要添加的共性功能的代码载体,是程序员要表达述求的类型,比如: 要添加日志功能,则我们需要开发一个 LogAdvice 类,要添加事务功能,则我们要开发 TransactionAdvice类,等....
-
PointCut, 切入点,它是指Advice要被织入到目标对象的匹配规则【match pattern】,它有多个连接点[JointPoint]组成,如下:
-
before, 在目标方法执行之前
-
after, 目标方法执行之后,是在目标方法已经返回
-
afterThrowing, 目标方法出现异常时,在catch块执行
-
afterReturning, 目标方法中的finally块执行【不一定要出现异常】
-
around, 以上4个综合体
-
-
JoinPoint, 连接点,也就是PointCut匹配到目标对象的方法后,在方法的哪个执行时间切入的连接点。
-
Weave,织入的动作,是一个动词,指的是Spring AOP 是如何把切面“织入”到目标对象,本质是基于代理来实现的,SpringAOP支持两种代理模式:
-
基于JDK自带的动态代理机制,也就是
java.lang.reflect.Proxy
和java.lang.reflect.InvocationHandler
,这种机制有一个前提,就是目标对象一定要有实现的接口。 -
基于第三方提供的代理库叫 cglib,它是基于字节码增加的一个代理库,它的功能丰常强大,任何的对象的都可以通过它来产生代理。
-
SpringAOP的使用
-
开发 Advice 类型, 当做一个Bean来管理,所以需要打上
@Component
注解 -
指定匹配规则,语法有多种
-
要开启AOP
AOP相关的注解
-
@EnableAspectJAutoProxy //开启AOP的动态代理
-
@Aspect 表示此类是一个切面,要配合
@Component
使用 -
@Order 表示多个切面的优先顺序,数据越小,优先级越高
-
@Pointcut 用来制定匹配的规则,它的语法:
execution(修饰符 * 包名.类名|*.*|方法名.(..|*,*))
-
@Before 连接点,它要引用 @Pointcut 或者直接写 匹配规则
-
@After 连接点,它要引用 @Pointcut 或者直接写 匹配规则
-
@AfterThrowing, 连接点,它要引用 @Pointcut 或者直接写 匹配规则
-
@AfterReturning 连接点,它要引用 @Pointcut 或者直接写 匹配规则
-
@Around, 连接点,它要引用 @Pointcut 或者直接写 匹配规则