Spring【AOP】

AOP-面向切面编程

AOP:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

SpringAop中,通过Advice定义横切逻辑,并支持5种类型的Advice:

导入依赖

XML 复制代码
<dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

applicationContext.xml

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

</beans>

Spring 实现AOP的3种方式

1、使用Spring API

编写两个扩展功能的类Log、和AfterLog,分别将添加到旧业务的前面和后面

Log类

java 复制代码
import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

public class Log implements MethodBeforeAdvice {
    //method: 要执行的目标对象的方法
    //args: 参数
    //target: 目标对象
    @Override
    public void before(Method method, Object[] args, Object target) throws Throwable {
        System.out.println(target.getClass().getName()+"的"+method.getName()+"方法被执行了");
    }


}

AfterLog类

java 复制代码
import org.springframework.aop.AfterReturningAdvice;

import java.lang.reflect.Method;

public class AfterLog implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object result, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println("执行了"+method.getName()+"方法,返回结果为"+result);
    }
}

配置spring配置文件

XML 复制代码
    <!--方式1-->
    <!--配置aop:需要导入aop的xsi信息-->
    <aop:config>
        <!--切入点 execution(要执行的位置!)-->
        <aop:pointcut id="pointcut" expression="execution(* com.study.service.UserServiceImpl.*(..))"/>
        <!--执行环绕-->
        <aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
        <aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
    </aop:config>

2、自定义类实现

编写一个自定义切面类 DiyPointCut

java 复制代码
public class DiyPointCut {
    public void before(){
        System.out.println("方法执行前");
    }
    public void after(){
        System.out.println("方法执行后");
    }
}

配置spring配置文件

XML 复制代码
 <!--方式2-->
    <bean id="diy" class="com.study.diy.DiyPointCut"/>
    <aop:config>
        <!--自定义切面-->
        <aop:aspect ref="diy">
            <aop:pointcut id="point" expression="execution(* com.study.service.UserServiceImpl.*(..))"/>
            <aop:before method="before" pointcut-ref="point"/>
            <aop:after method="after" pointcut-ref="point"/>
        </aop:aspect>
    </aop:config>

3、使用注解实现AOP

编写类

java 复制代码
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

//使用注解实现AOP 标注这个类为一个切面
@Aspect
public class AnnotationPointCut {

    @Before("execution(* com.study.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("方法之前执行");
    }
}

编写配置文件

XML 复制代码
    <!--方式3-->
    <bean id="annotationPointCut" class="com.study.diy.AnnotationPointCut"/>
    <!--开启注解支持!-->
    <aop:aspectj-autoproxy/>
相关推荐
Aaa11111443几秒前
四类地址 逻辑地址 线性地址 虚拟地址 物理地址
java
小则又沐风a1 分钟前
深入了解进程概念 第二章
java·linux·服务器·前端
程序猿进阶3 分钟前
OpenClaw Mac 安装教程
java·macos·ai·架构·agent·openclaw
重生之小比特4 分钟前
【MySQL 数据库】用户管理与权限控制
android·数据库·mysql
凯瑟琳.奥古斯特17 分钟前
信号分类与特性解析
java·开发语言·职场和发展
杨云龙UP19 分钟前
MySQL主库高峰期备份引发504故障:从库手动切换接管 + 主从恢复同步 + Docker版DB2重启实战_2026-05-17
linux·运维·数据库·mysql·docker·容器·centos
JAVA面经实录91720 分钟前
JVM 性能监控 + 全链路分析实战 + 性能优化(完整版)
java·jvm
用户3983461612023 分钟前
Go-Spring 实战第 5 课 —— 配置来源:Reader、Provider、环境变量与命令行参数
spring·go
号码认证服务27 分钟前
小米、OPPO、VIVO手机支持号码认证显示公司名吗?
java·服务器·网络·经验分享·智能手机·云计算·php
小帅记事31 分钟前
MySQL 查询性能监控与分析 完整版
mysql