【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以

简介: 【Spring】核心部分之AOP:通过列举代码例子,从底层刨析,深入源码,轻轻松松理解Spring的核心AOP,AOP有这一篇足以

基本概念


面向切面编程,也叫面向方面编程,利用aop可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各个部分之间降低耦合,提高程序的可重用性,同时提高了开发效率。


基本原理


用到了代理模式,有关代理模式见文章:设计模式——代理模式详解(Java版)


专业术语


连接点:可以被增强的方法

切入点:实际被增强的方法

通知(增强):实际增强的部分

通知有多种类型

前置通知

后置通知

环绕通知

异常通知

最终通知

切面:是一个动作,将通知应用到切入点的过程


案例演示


基于注解(重点)


1.需要增强的方法


public class User {
    public void Add(){
        System.out.println("add............");
    }
}


2,编写增强类


public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before...........");
    }
}


3.进行通知的配置

第一步:在spring的配置文件中开启注解扫描


xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
<!--开启注解扫描 -->
    <context:component-scan base-package="com.li.spring"></context:component-scan>


第二步:使用注解创建两个类的对象


@Component
public class User {
    public void Add(){
        System.out.println("add............");
    }
}
@Component
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before...........");
    }
}


第三步:在增强的类上面加注解Aspect


@Aspect //生成代理对象
@Component
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before...........");
    }
}


第四步:在spring的配置文件中开启Aspect生成代理对象


 xmlns:aop="http://www.springframework.org/schema/aop"
 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
  <!--开启aspect生成代理对象 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4.配置不同类型的通知


@Component
@Aspect //生成代理对象
public class UserProxy {
    //前置通知
    @Before(value = "execution(* com.li.spring.User.Add(..))")
    public void before(){
        System.out.println("before...........");
    }
    //后置通知
    @After(value = "execution(* com.li.spring.User.Add(..))")
    public void after(){
        System.out.println("after...........");
    }
    @AfterReturning(value = "execution(* com.li.spring.User.Add(..))")
    public void AfterReturning(){
        System.out.println("AfterReturning...........");
    }
    @AfterThrowing(value = "execution(* com.li.spring.User.Add(..))")
    public void AfterThrowing(){
        System.out.println("AfterThrowing...........");
    }
    //环绕通知
    @Around(value = "execution(* com.li.spring.User.Add(..))")
    public void Around(ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("环绕之前...........");
        try {
            Object proceed = proceedingJoinPoint.proceed();
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        System.out.println("环绕之后...........");
    }
}

1c24e9eb46de419ea93f09cc79c77753.png


基于配置文件


1.准备要增强的类及方法


public class People {
    public void say(){
        System.out.println("say................");
    }
}


public class PeopleProxy {
    public void before(){
        System.out.println("before.................");
    }
}


2.在spring的配置文件中创建两个类


<bean id="people" class="com.li.spring.People"></bean>
    <bean id="peopleproxy" class="com.li.spring.PeopleProxy"></bean>


3.在spring的配置文件中配置切入点


<!--配置aop增强-->
    <aop:config>
        <!--切入点-->
        <aop:pointcut id="p" expression="execution(* com.li.spring.People.say(..))"/>
        <!-- 配置切面-->
        <aop:aspect ref="peopleproxy">
            <!--配置增强作用在具体的方法上 -->
            <aop:before method="before" pointcut-ref="p"></aop:before>
        </aop:aspect>
    </aop:config>


4.测试


public class test {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml");
        People people = context.getBean("people", People.class);
        people.say();
    }
}

cfcb0d1d0e654e45abacbf9843e0aff1.png


相关文章
|
4月前
|
监控 安全 Java
Spring AOP实现原理
本内容主要介绍了Spring AOP的核心概念、实现机制及代理生成流程。涵盖切面(Aspect)、连接点(Join Point)、通知(Advice)、切点(Pointcut)等关键概念,解析了JDK动态代理与CGLIB代理的原理及对比,并深入探讨了通知执行链路和责任链模式的应用。同时,详细分析了AspectJ注解驱动的AOP解析过程,包括切面识别、切点表达式匹配及通知适配为Advice的机制,帮助理解Spring AOP的工作原理与实现细节。
|
1月前
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
1月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
2月前
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
3月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
558 1
Spring boot 使用mybatis generator 自动生成代码插件
|
5月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
376 70
|
3月前
|
Java 调度 流计算
基于Java 17 + Spring Boot 3.2 + Flink 1.18的智慧实验室管理系统核心代码
这是一套基于Java 17、Spring Boot 3.2和Flink 1.18开发的智慧实验室管理系统核心代码。系统涵盖多协议设备接入(支持OPC UA、MQTT等12种工业协议)、实时异常检测(Flink流处理引擎实现设备状态监控)、强化学习调度(Q-Learning算法优化资源分配)、三维可视化(JavaFX与WebGL渲染实验室空间)、微服务架构(Spring Cloud构建分布式体系)及数据湖建设(Spark构建实验室数据仓库)。实际应用中,该系统显著提升了设备调度效率(响应时间从46分钟降至9秒)、设备利用率(从41%提升至89%),并大幅减少实验准备时间和维护成本。
253 0
|
5月前
|
人工智能 前端开发 Java
十几行代码实现 Manus,Spring AI Alibaba Graph 快速预览
Spring AI Alibaba Graph 的核心开发已完成,即将发布正式版本。开发者可基于此轻松构建工作流、智能体及多智能体系统,功能丰富且灵活。文章通过三个示例展示了其应用:1) 客户评价处理系统,实现两级问题分类与自动处理;2) 基于 ReAct Agent 的天气预报查询系统,循环执行用户指令直至完成;3) 基于 Supervisor 多智能体的 OpenManus 实现,简化了流程控制逻辑并优化了工具覆盖度。此外,还提供了运行示例的方法及未来规划,欢迎开发者参与贡献。
|
6月前
|
安全 API
鸿蒙开发:实现AOP代码插桩能力
正确的运用AOP,可以提升代码的模块化、复用性、可维护性和灵活性,同时降低了耦合度,使系统更易于扩展和维护。
122 13
鸿蒙开发:实现AOP代码插桩能力