博客
关于我
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/

    你可能感兴趣的文章
    Multiple websites on single instance of IIS
    查看>>
    mysql CONCAT()函数拼接有NULL
    查看>>
    multiprocessing.Manager 嵌套共享对象不适用于队列
    查看>>
    multiprocessing.pool.map 和带有两个参数的函数
    查看>>
    MYSQL CONCAT函数
    查看>>
    multiprocessing.Pool:map_async 和 imap 有什么区别?
    查看>>
    MySQL Connector/Net 句柄泄露
    查看>>
    multiprocessor(中)
    查看>>
    mysql CPU使用率过高的一次处理经历
    查看>>
    Multisim中555定时器使用技巧
    查看>>
    MySQL CRUD 数据表基础操作实战
    查看>>
    multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
    查看>>
    mysql csv import meets charset
    查看>>
    multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
    查看>>
    MySQL DBA 数据库优化策略
    查看>>
    multi_index_container
    查看>>
    mutiplemap 总结
    查看>>
    MySQL Error Handling in Stored Procedures---转载
    查看>>
    MVC 区域功能
    查看>>
    MySQL FEDERATED 提示
    查看>>