博客
关于我
Spring Advice
阅读量:798 次
发布时间: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 外键约束
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>
    mysql 多字段删除重复数据,保留最小id数据
    查看>>
    MySQL 多表联合查询:UNION 和 JOIN 分析
    查看>>
    MySQL 大数据量快速插入方法和语句优化
    查看>>
    mysql 如何给SQL添加索引
    查看>>
    mysql 字段区分大小写
    查看>>
    mysql 字段合并问题(group_concat)
    查看>>
    mysql 字段类型类型
    查看>>
    MySQL 字符串截取函数,字段截取,字符串截取
    查看>>
    MySQL 存储引擎
    查看>>
    mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
    查看>>
    MySQL 存储过程参数:in、out、inout
    查看>>
    mysql 存储过程每隔一段时间执行一次
    查看>>
    mysql 存在update不存在insert
    查看>>
    Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
    查看>>
    Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
    查看>>
    Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
    查看>>
    Mysql 学习总结(89)—— Mysql 库表容量统计
    查看>>