Spring AOP代理增强是什么?一文带你搞懂切面编程

 更新时间:2026年08月12日 09:54:21   作者:DaiMaXiaoBai321  
还在为Spring AOP代理增强发愁?本文用通俗例子讲解目标类加额外功能就是代理类,涵盖日志、事务等通用增强,你将学会AOP的四种增强方式(前置、后置、异常、环绕)以及如何通过注解灵活实现方法增强,附带完整步骤和代码示例,帮你快速上手切面编程

前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

提示:以下是本篇文章正文内容,下面案例可供参考

一、什么Spring-AOP代理增强?

目标类 + 额外功能 = 代理类

比如:日志处理/事务处理/异常处理/性能分析…Redis 非关系型数据

  1. 通过spring AOP的代理功能,给代码增加额外的通用功能
  2. 业务逻辑就专心的处理实际需求,通用的增强功能独立出来
  3. 代理的专业术语

额外功能叫 增强

目标类叫 切入点 或 切面

将增强 加入到 切入点,叫编织

AOP是面向切面编程的一种实现

二、AOP步骤

1. 导包

书写一个增强类(前置为例)

public class MyBeforeAdvice implements MethodBeforeAdvicel
@override
public void before(Method arg0,Object[] arg1,Object arg2) throws Throwable {
System.out.println("this is MyBeforeAdvice");
}
public class MyBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method arg0,Object[] arg1,Object arg2)throws Throwable {
//获取目标方法名称
String method = argo.getName(;
System.out.println("the method : " +method);
//获取目标方法参数的实参
for(int i=0;i<arg1. length;i++)i
System.out.println("the arg1 : "+arg1[i]);
}
/获取目标类
System.out.println("the arg2 : "+arg2.getClass());
System.out.println("this is MyBeforeAdvice");


2. 配置增强类的bean

代码如下(示例):

<!--增强功能–->
<bean id="myBeforeAdvice" class="com.gxy .aop.MyBeforeAdvice"></bean>

3. 配置AOP的编织功能 写接口的包路径

<!--AOP配置–->
<aop:config>
4
<aop:pointcut expression="execution(*com.gxy. service.*.*(..))" id="myPointCut"/>
3`5'
12
<aop:advisor advice-ref="myBeforeAdvice" pointcut-ref="myPointCut"/>
</aop:config>
package com.gxy.service; 2
import java.io.IOException;
public interface ProductService {
3
//商品展示
5
public List<Product> selectAll()throws IOException;
  • 1: 通配接口或者普通方法
  • 2: 包名
  • 3: 类名
  • 4: 方法名
  • 5: 参数

AOP的4种增强方式

1. 前置增强,在核心功能之前执行的额外功能

public class MyBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method arg0,Object[] arg1,Object arg2) throws Throwable {
/获取目标方法名称
String method = argo.getName();
System.out.println("the method: "+method);
/获取目标方法参数的实参列表
for(int i=0;i<arg1.length;i++)i
System.out.println("the arg1: "+arg1[i]);
}
//获取目标实现类的类路径
System.out.println("the arg2: "+arg2.getClass());
system.out.println("this is MyBeforeAdvice");
}


2. 后置增强,在核心功能之后执行的额外功能

public class MyAfterAdvice implements AfterReturningAdvice{
@Override
public void afterReturning(Object arg0,Method argl,Object[] arg2,Object arg3)throws Throwable {
//获取反参参数的类型
system.out.println("the argo: "+argo.getClass());
/获取目标方法名称
system.out.println("the arg1 : "+arg1.getName());
获取目标方法多数的实参列表
for(int i=o;i<arg2.length;i++)
System.out.println("the arg2: "+arg2[i]);
)
广获取目标实现类的类路径
System.out.println("the arg3:"+arg3.getClass();
System.out.println("this is afterReturning advice");

3. 异常增强,在核心功能发生异常时执行的额外功能

public class MyThrowsAdvice implements ThrowsAdvice{
public void afterThrowing(Method method,0bject[] args,Object target,Exception ex){
.System.out.println(target+"里面的"+method.getName()+"产生了"+ex.getMessage());

4. 环绕增强,在核心功能之前以及之后执行的额外功能

public class MyInterceptor implements MethodInterceptor{
@override
public Object invoke(MethodInvocation argo)throws Throwable {
System.out.println("this is my interceptor");
//获取目标实现类对象
System.out.println("arg0.getThis()"+arg0.getThis().getClass().toString());
//获取目标方法名称
System.out.println("argo.getMethod() : "+arg0.getMethod().getName());
/获取目标方法参数的实参列表
Object[]arguments = argo.getArguments();
for(int i=O;i<arguments.length;i++)il
System.out.println("argo.getArguments() : "+arguments[i]);
}
7/由于启动了环绕增强,目标类的方法将不会被执行,而被.proceed取代,并返回目标类的反参
//执行目标方法
Object object = argo.proceed();
return object;

AOP注解

可以灵活的定义哪个具体的方法实现增强功能

写一个软 接口 创建或自定义一个注解

@AnnotationLog

public @interface AnnotationLog {
//软接口

增强类照常写

修改切入点

<aop:pointcut expression="@annotation(com.gxy.aop.AnnotationLog)" id="myPointCut"/>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java判断ip是否为指定网段示例

    java判断ip是否为指定网段示例

    这篇文章主要介绍了java判断ip是否为指定网段示例方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • IDEA lombok注解(@Date、@Setter、@Getter)不起作用的解决

    IDEA lombok注解(@Date、@Setter、@Getter)不起作用的解决

    作者在使用Lombok时遇到问题,发现IntelliJ IDEA需要安装Lombok插件才能支持Lombok注解,作者通过安装Lombok插件并重启IDEA解决了问题,并分享了这一经验,希望能帮助其他遇到相同问题的开发者
    2026-01-01
  • Mybatis-Plus批量插入Mysql中id值自增值过大问题及解决

    Mybatis-Plus批量插入Mysql中id值自增值过大问题及解决

    MyBatis-Plus批量新增数据时自增ID问题解决方案,结合数据库设置与代码注解配置,确保自增ID正确生成与使用
    2026-06-06
  • 解决MyBatis中Enum字段参数解析问题

    解决MyBatis中Enum字段参数解析问题

    本文主要介绍了解决MyBatis中Enum字段参数解析问题,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 浅析JAVA 循环结构

    浅析JAVA 循环结构

    这篇文章主要介绍了JAVA 循环结构的相关资料,文中讲解的非常细致,示例代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • SpringBoot自动装配原理解析

    SpringBoot自动装配原理解析

    Spring Boot自动装配是指在Spring Boot应用启动时,根据类路径下的jar包依赖、Bean定义、各种配置文件等信息,自动配置Spring应用上下文的Bean,本文给大家详细解析了SpringBoot自动装配原理,需要的朋友可以参考下
    2024-11-11
  • Java日常练习题,每天进步一点点(21)

    Java日常练习题,每天进步一点点(21)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • 总结Java常用排序算法

    总结Java常用排序算法

    在本文里我们给大家整理了关于Java常用排序算法以及实例代码分析,需要的朋友们跟着学习下。
    2019-03-03
  • Java dbcp连接池基本使用方法详解

    Java dbcp连接池基本使用方法详解

    这篇文章主要介绍了Java dbcp连接池基本使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Springboot 实现跨域访问无需使用jsonp的实现代码

    Springboot 实现跨域访问无需使用jsonp的实现代码

    这篇文章主要介绍了Springboot 实现跨域访问 无需使用jsonp的实现代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09

最新评论