首页 > 其他分享 >AOP

AOP

时间:2024-06-23 14:44:27浏览次数:3  
标签:代理 接口 切面 AOP 注解 public

AOP与OOP

  • OOP:面向对象编程。关注于数据和行为的封装,通过类和对象来组织代码。用于构建系统的主体结构,定义数据结构和操作这些数据的方法。

  • AOP:面向切面编程。专注于将横切关注点(如日志记录、事务管理、安全性等)与业务逻辑分离,从而提高模块化和代码重用。通常用于处理那些在多个对象或类中重复出现的逻辑,如日志记录、性能统计、事务管理等。

代理模式回顾

编写代码的原则之二:
职责清晰:一个类只负责一件事;
易于测试:一次只测一个功能。

代理(Proxy)通过封装一个已有接口,并向调用方返回相同的接口类型,能让调用方在不改变任何代码的前提下增强某些功能(例如,鉴权、延迟加载、连接池复用等)。AOP本质上只是一种代理模式的实现方式

代理示例代码
public class AProxy implements A {
    private A a;
    public AProxy(A a) {
        this.a = a;
    }
    public void a() {
    if (getCurrentUser().isRoot()) {
        this.a.a();
    } else {
        throw new SecurityException("Forbidden");
    }
}
}

通过代理可以获得更清晰,更简洁的代码

  • A接口:只定义接口;

  • ABusiness类:只实现A接口的业务逻辑;

  • APermissionProxy类:只实现A接口的权限检查代理。

Java中的AOP织入方式

  • 编译期:在编译时,由编译器把切面调用编译进字节码,这种方式需要定义新的关键字并扩展编译器,AspectJ就扩展了Java编译器,使用关键字aspect来实现织入;

  • 类加载器:在目标类被装载到JVM时,通过一个特殊的类加载器,对目标类的字节码重新“增强”;

  • 运行期:目标对象和切面都是普通Java类,通过JVM的动态代理功能或者第三方库实现运行期动态织入。(Spring的AOP实现就是基于JVM的动态代理)

AOP常见概念

  • Aspect:切面,即一个横跨多个核心逻辑的功能,或者称之为系统关注点;

  • Joinpoint:连接点,即定义在应用程序流程的何处插入切面的执行;

  • Pointcut:切入点,即一组连接点的集合;

  • Advice:增强,指特定连接点上执行的动作;

  • Introduction:引介,指为一个已有的Java对象动态地增加新的接口;

  • Weaving:织入,指将切面整合到程序的执行流程中;

  • Interceptor:拦截器,是一种实现增强的方式;

  • Target Object:目标对象,即真正执行业务的核心逻辑对象;

  • AOP Proxy:AOP代理,是客户端持有的增强后的对象引用。

使用AspectJ实现AOP

引入依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>6.1.9</version>
        </dependency>

创建一个类并定义执行方法

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(public * com.zyj.service.UserService.*(..))")
    public void doAccessCheck() {
        System.err.println("[Before] do access check...");
    }

    // 在执行MailService的每个方法前后执行:
    @Around("execution(public * com.zyj.service.MailService.*(..))")
    public Object doLogging(ProceedingJoinPoint pjp) throws Throwable {
        System.err.println("[Around] start " + pjp.getSignature());
        Object retVal = pjp.proceed();
        System.err.println("[Around] done " + pjp.getSignature());
        return retVal;
    }
}

给配置类加上@EnableAspectJAutoProxy注解

通过这个注解,Spring的IoC容器会自动查找带有@Aspect的Bean,然后根据每个方法的@Before、@Around等注解把AOP注入到特定的Bean中。

使用注解装配AOP

使用AspectJ实现AOP存在无区别覆盖,容易导致不恰当的覆盖范围,新增的Bean若不清楚当前装配规则容易被强迫装配
通过注解实现AOP,可以清楚的看到Bean中的哪些方法被装配了

标签:代理,接口,切面,AOP,注解,public
From: https://www.cnblogs.com/BlogsOfZyj/p/18258062

相关文章

  • java干货 spring aop的理解和使用
    文章目录一、AOP概念1.1aop思想1.2aop应用场景二、aop如何使用2.1八个核心名词2.2代码实现一、AOP概念1.1aop思想APO(面向切面编程)是一种编程思想,它通过将通用的横向关注点(日志、事务、权限控制等)与业务逻辑分离,实现解耦,使得代码更易于维护。核心......
  • SpringBoot+AOP+Redis自定义注解实现防重复提交
    1.哪些因素会引起重复提交?开发项目过程中可能会出现下面这些情况:前端下单按钮重复点击导致订单创建多次网速等原因造成页面卡顿,用户重复刷新提交请求黑客或恶意用户使用Postman等http工具重复恶意提交表单2.重复提交会带来哪些问题?重复提交带来的问题:会导致数据......
  • DataOps真能“降本增效”?
    在各行各业中,越来越多的公司开始重视收集数据,并寻找创新方法来获得真实可行的商业成果,并且愿意投入大量时间和金钱来实现这一目标。据IDC称,数据和分析软件及云服务市场规模在2021年达到了900亿美元,随着企业继续对人工智能和机器学习(AI/ML)和现代数据计划进行投资,预计到2......
  • 【AOP问题处理】:AopContext.currentProxy()方法异常处理:java.lang.IllegalStateExcept
    原因是代理对象内部方法的调用不会触发AOP代理。先看代码:自定义了一个注解:importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;//使用元注解......
  • .NET Core 3.x 基于AspectCore实现AOP,实现事务、缓存拦截器
    最近想给我的框架加一种功能,就是比如给一个方法加一个事务的特性Attribute,那这个方法就会启用事务处理。给一个方法加一个缓存特性,那这个方法就会进行缓存。这个也是网上说的面向切面编程AOP。AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码......
  • 事务&AOP
    事物管理事务管理是指对一系列数据库操作进行管理,确保这些操作要么全部成功执行,要么在遇到错误时全部回滚,以维护数据的一致性和完整性。在多用户并发操作和大数据处理的现代软件开发领域中,事务管理已成为确保数据一致性和完整性的关键技术之一。基本概念定义:事务是由N步数据......
  • 【Spring】AOP
    AOP英文全称:AspectOrientedProgramming(面向切面编程、面向方面编程)。在程序运行期间在不修改源代码的基础上对已有方法进行增强(无侵入性:解耦)AOP快速入门pom.xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</......
  • Spring-AOP概述
    1.AOP的基本概念AOP:面向切面编程(AspectOrientedProgramming),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术AOP的作用:利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率没......
  • AOP切面的实现原理【底层源码】
    AOP是基于IOC的Bean加载来实现的,将切面类的所有切面方法根据使用的注解生成对应的Advice,并将Advice连同切入点匹配器和切面类等信息一并封装到Advisor,为后续交给代理增强实现做准备这里我们可以很明确的知道,AOP也是在Bean容器中被Spring管理的,根据初始化过程打断点定位......
  • AOP代理的创建【底层源码】
    代理的创建(源码)创建代理的方法是postProcessAfterInitialization:如果Bean被子类标识为代理,则使用配置的拦截器创建一个代理源码参考:AOP切面底层原理【底层源码】-postProcessAfterInitialization源码部分wrapIfNecessary方法主要用于判断是否需要创建代理,如果bean能......