Java 面向切面 AOP
一、什么是AOP
AOP: Aspect Oriented Programming 即面向切面编程,它是一种思想,针对业务处理过程中的切面进行提取,以达到优化代码的目的,减少重复代码的目的。例如在编写业务逻辑的时候,
我们习惯都要写日志,事务控制,以及权限控制,每一个子模块都要写这些代码,存在明显的重复。这时候,运用面向切面的编程思想,采用横切技术,将代码中重复的部分,不影响业务逻辑的
部分抽取出来,放在某个地方集中式管理,调用。形成日志切面、事务控制切面、权限控制切面。这样我们只需要关注业务逻辑,即提高了效率,又使得代码变得简洁优雅。这是一种面向切面的
编程思想
AOP 的编程原理:使用了动态代理的技术,动态代理包括JDK 机制的动态代理:只能用于实现了接口的类生成代理。 Cglib 代理:针对没有实现接口的类生成代理,采用的是底层字节码增强
技术,生成当前类的代理类(增强技术使用的是ASM,字节码操作框架)
分类
- AOP (Aspect Oriented Programming) 面向切面编程
- OOP (Object Oriented Programming) 面向对象编程
- POP( Procedure Oriented programming) 面向过程编程
- FP (Functional Programming) 面向函数编程
二、如何实现
2.1 引入maven 依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.2 编写切面配置
@Aspect @Component public class MyLogAspect { private final Logger logger = LoggerFactory.getLogger(MyLogAspect.class); @Pointcut("@annotation(com.example.demo.annotation.MyLog)") public void pointCut(){} @Around("pointCut()") public void around(ProceedingJoinPoint joinPoint) throws Throwable{ logger.info("around 前方法"); joinPoint.proceed(); logger.info("around 后方法"); } @Before("pointCut()") public void doBefore(){ logger.info("doBefore 方法"); } @AfterReturning("pointCut()") public void doAfterReturn(JoinPoint joinPoint){ logger.info("doAfterReturn 方法"); } @After("pointCut()") public void doAfter(){ logger.info("doAfter 方法"); } @AfterThrowing("pointCut()") public void doThrowable(){ logger.info("doThrowable 方法"); } }
三、基本概念
- 通知(Advice): AOP 框架中的增强处理。通知描述了切面何时执行以及如何执行增强处理。
- 连接点(join point): 连接点表示应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。在 Spring AOP 中,连接点总是方法的调用。
- 切点(PointCut): 可以插入增强处理的连接点。
- 切面(Aspect): 切面是通知和切点的结合。
- 引入(Introduction):引入允许我们向现有的类添加新的方法或者属性。
- 织入(Weaving): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。
通知的类型
正常情况执行顺序:
- around start
- before
- 方法
- aroud end
- after
- afterReturning
异常执行顺序:
- around start
- before
- 方法(产生异常)
- after
- afterThrowing