Spring Advice
前置通知:在方法执行前打印“前置增强---------------”。 环绕通知:在方法执行前打印“执行方法之前的环绕通知”,方法执行后打印“执行方法之后的环绕通知”,并将返回值修改为“小黑”。 后置通知:在方法执行后打印“后置增强”。
发布日期:2025-06-20 20:53:20
浏览次数:46
分类:精选文章
本文共 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在实际应用中的强大功能,它为我们的代码增添了丰富的功能,同时保持了代码的简洁性和可维护性。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2026年06月11日 13时58分31秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP设计模式:观察者模式
2023-03-02
php访问mysql(1)
2023-03-02
php详细学习1
2023-03-02
php语言优劣
2023-03-02
PHP语言最优雅的支付SDK扩展包
2023-03-02
PHP请求https域名发生segment fault段错误
2023-03-02
PHP读写XML文件
2023-03-02
PHP读写XML文件
2023-03-02
R&Python Data Science 系列:数据处理(3)
2023-03-02
php读取xml 数据库字段超长处理
2023-03-02
php课程 12-40 抽象类的作用是什么
2023-03-02
php课程 4-16 数组自定义函数(php数组->桶)
2023-03-02
PHP调用接口用post方法传送json数据
2023-03-02
php转化IP为整形
2023-03-02
php输出数据到csv文件
2023-03-02
php输出语句
2023-03-02
php运行原理详细说明
2023-03-02
php运行环境出现Undefined index 或variable时解决方法
2023-03-02
php进程通信
2023-03-02
R&Python Data Science 系列:数据处理(2)
2023-03-02