博客
关于我
Spring Advice
阅读量:800 次
发布时间:2023-04-17

本文共 3621 字,大约阅读时间需要 12 分钟。

Spring AOP浅谈深入——从零开始理解Spring的面向方面编程

面向方面编程(AOP)是Spring框架中最为核心的功能之一,它的基本思想是通过在代码的执行过程中插入额外的功能,模块化处理横切关注点。简单来说,Spring AOP就是一个非常强大的拦截器框架,它可以在方法执行前、执行后或执行过程中插入自定义的逻辑。

AOP的四大核心通知类型

在Spring AOP中,最重要的核心是对方法执行过程的不同阶段进行切入,这可以通过定义不同的通知类型(Advice)来实现。具体来说,Spring AOP支持四种主要的通知类型:

  • 前置通知(Before Advice)

    通知(Advice)之前,方法执行前运行。这个阶段的通知可以用来做一些准备工作,比如数据验证、资源释放等。

  • 后置通知(After Returning Advice)

    方法执行后返回一个结果。这个阶段可以用来处理方法执行后的数据处理,比如数据转换、记录日志等。

  • 抛出通知(Throws Advice)

    方法抛出异常后运行。这个阶段可以用来处理异常,比如捕获异常、记录错误日志等。

  • 环绕通知(Around Advice)

    环绕方法执行过程。这个通知可以同时在方法执行前后执行,既可以做前置处理,也可以做后置处理。它是前置和后置通知的综合体现,非常适合需要在方法执行过程中维护一些上下文的场景。

  • Spring AOP的实际应用示例

    为了更好地理解Spring AOP的工作原理,我们可以通过一个实际的例子来体验。下面是一个简单的用户服务类的接口及其实现类:

    public interface UserService {    void addUser();    String eat();}
    public class UserServiceImpl implements UserService {    public void addUser() {        System.out.println("添加用户");    }    public String eat() {        String some = "apple";        System.out.println("eat a little apple");        return some;    }}

    接下来,我们需要为每个通知类型定义对应的增强类:

    public class BeforeAdvice implements MethodBeforeAdvice {    public void before(Method method, Object[] objects, Object o) throws Throwable {        System.out.println("前置增强---------------");    }}
    public class AfterAdvice implements AfterReturningAdvice {    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {        System.out.println("后置增强");    }}
    public class AroundAdvice implements MethodInterceptor {    public Object invoke(MethodInvocation methodInvocation) throws Throwable {        System.out.println("执行方法之前的环绕通知");        Object result = methodInvocation.proceed();        if (result != null) {            result = "小黑";        }        System.out.println("执行方法之后的环绕通知");        return result;    }}

    为了实现对方法执行过程的增强,我们需要配置Spring的ApplicationContext:

    beforeAdvice
    afterAdvice
    aroundAdrice

    测试验证

    接下来,我们可以通过测试来验证各个通知类型的增强是否正常工作。以下是一个简单的测试类:

    public class Test1011 {    @Test    public void yichang() {        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");        UserService service = (UserService) context.getBean("userProxy");        service.addUser();        System.out.println("---------------");        service.eat();    }    @Test    public void around() {        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");        UserService service = (UserService) context.getBean("userProxy");        service.addUser();        System.out.println("---------------");        service.eat();    }    @Test    public void before() {        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");        UserService service = (UserService) context.getBean("userProxy");        service.addUser();        System.out.println("---------------");        service.eat();    }    @Test    public void after() {        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");        UserService service = (UserService) context.getBean("userProxy");        service.addUser();        System.out.println("---------------");        service.eat();    }}

    通过以上配置和测试,我们可以看到Spring AOP的实际操作效果:

  • 前置通知:在方法执行前打印“前置增强---------------”。
  • 环绕通知:在方法执行前打印“执行方法之前的环绕通知”,方法执行后打印“执行方法之后的环绕通知”,并将返回值修改为“小黑”。
  • 后置通知:在方法执行后打印“后置增强”。
  • 通过以上配置和测试,我们可以清晰地看到Spring AOP在实际应用中的强大功能,它为我们的代码增添了丰富的功能,同时保持了代码的简洁性和可维护性。

    转载地址:http://smgfk.baihongyu.com/

    你可能感兴趣的文章
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>
    MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
    查看>>
    MYSQL中TINYINT的取值范围
    查看>>
    MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>