Java 面向切面 AOP

  1. 什么是AOP
  2. 如何实现
  3. 基本概念

一、什么是AOP

  AOP: Aspect Oriented Programming 即面向切面编程,它是一种思想,针对业务处理过程中的切面进行提取,以达到优化代码的目的,减少重复代码的目的。例如在编写业务逻辑的时候,

我们习惯都要写日志,事务控制,以及权限控制,每一个子模块都要写这些代码,存在明显的重复。这时候,运用面向切面的编程思想,采用横切技术,将代码中重复的部分,不影响业务逻辑的

部分抽取出来,放在某个地方集中式管理,调用。形成日志切面、事务控制切面、权限控制切面。这样我们只需要关注业务逻辑,即提高了效率,又使得代码变得简洁优雅。这是一种面向切面的

编程思想

  AOP 的编程原理:使用了动态代理的技术,动态代理包括JDK 机制的动态代理:只能用于实现了接口的类生成代理。 Cglib 代理:针对没有实现接口的类生成代理,采用的是底层字节码增强

技术,生成当前类的代理类(增强技术使用的是ASM,字节码操作框架)

分类

  1.  AOP (Aspect Oriented Programming) 面向切面编程
  2. OOP (Object Oriented Programming) 面向对象编程
  3. POP( Procedure Oriented programming) 面向过程编程
  4. 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): 将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入。

通知的类型

        

正常情况执行顺序:

  1. around start
  2. before
  3. 方法
  4. aroud end
  5. after
  6. afterReturning

异常执行顺序:

  1. around start
  2. before
  3. 方法(产生异常)
  4. after
  5. afterThrowing

参考:https://www.cnblogs.com/joy99/p/10941543.html

参考:https://segmentfault.com/a/1190000020857142

原文地址:https://www.cnblogs.com/bytecodebuffer/p/10399432.html