文章目录

  • 概述
  • 实例

概述

环绕增强允许在目标类方法调用前后织入横切逻辑,它综合实现了前置,后置增强两者的功能.


实例

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

下面是我们用环绕增强同时实现上面的我们的示例。步骤如下:
创建业务接口类:Waiter.java
创建业务实现类:NativeWaiter.java
创建业务增强类:GreetingInterceptor.java
创建配置文件:conf-advice.xml
创建增强测试类:MethodInterceptorTest.java

业务接口类

package com.xgj.aop.spring.advice.methodInterceptor;public interface Waiter {void greetTo(String name);void serverTo(String name);
}

业务实现类

package com.xgj.aop.spring.advice.methodInterceptor;public class NaiveWaiter implements Waiter {@Overridepublic void greetTo(String name) {System.out.println("greetTo " + name);}@Overridepublic void serverTo(String name) {System.out.println("serverTo " + name);}}

业务增强类GreetingInterceptor.java

package com.xgj.aop.spring.advice.methodInterceptor;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;public class GreetingInterceptor implements MethodInterceptor {/*** 截取目标类方法的执行,并在前后添加横切逻辑* * @param invocation*            封装了目标方法和入参数组以及目标方法所带的实例对象* @return 代理对象* @throws Throwable*/@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {// 获取目标方法的入参Object[] args = invocation.getArguments();// 在目标方法执行前调用String clientName = (String) args[0];System.out.println("GreetingInterceptor:How are you!" + clientName);// 利用反射机制来调用目标方法Object object = invocation.proceed();// 在目标方法执行后调用System.out.println("GreetingInterceptor: please enjoy youself!");return object;}}

Spring直接使用AOP联盟所定义的MethodInterceptor作为环绕增强的接口,该接口拥有唯一的接口方法

public Object invoke(MethodInvocation invocation) throws Throwable

MethodInvocation不但封装了目标方法及其入参数组,还封装了目标方法所在的实例对象。通过MethodInvocation的getArguments()方法可以获取到目标方法的入参数组,通过proceed()方法反射调用目标实例相应的方法。

通过在实现类中定义横切逻辑可以很容易的实现方法前后的增强。


接下来在配置文件中对其进行配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:p="http://www.springframework.org/schema/p"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="target" class="com.xgj.aop.spring.advice.methodInterceptor.NaiveWaiter"/><bean id="greetingAroundAdvice" class="com.xgj.aop.spring.advice.methodInterceptor.GreetingInterceptor"></bean><bean id="waiter" class="org.springframework.aop.framework.ProxyFactoryBean"p:proxyInterfaces="com.xgj.aop.spring.advice.methodInterceptor.Waiter"p:interceptorNames="greetingAroundAdvice"p:target-ref="target"/></beans>

编写单元测试

package com.xgj.aop.spring.advice.methodInterceptor;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MethodInterceptorTest {@Testpublic void test() {ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:com/xgj/aop/spring/advice/methodInterceptor/conf-advice.xml");Waiter waiter = ctx.getBean("waiter", Waiter.class);waiter.greetTo("Xiao");waiter.serverTo("GongJiang");}}

运行结果

可见环绕增强起了作用。

Spring-AOP 通过配置文件实现 环绕增强相关推荐

  1. Spring AOP 标签形式及Around增强处理

    上一篇文章介绍了下Spring中的AOP xml配置方式.想了解的同学可以点击这里查看. 这次写一下标签形式. <aop:aspectj-autoproxy /> 首先要在spring配置 ...

  2. android aop静态方法,spring aop 不能对静态方法进行增强解决

    想要通过aop的方式记录HttpUtils发出的post请求日志,但是 aop 不能对静态方法进行增强.只能对实例方法进行增强.. 如果一定要增强静态方法,我们可以对目标类使用单例模式,然后通过调用实 ...

  3. spring aop代码的增强

    这篇博客,主要会分析spring aop是如何实现代码增强的. 从上一篇博客 我们大概知道,spring能在不改变代码的前提下,往一个方法的之前和之后添加代码. 想下,java中有哪种技术可以帮我们实 ...

  4. 在Intellij上面导入项目 AOP示例项目 AspectJ学习 Spring AoP学习

    为了学习这篇文章里面下载的代码:http://www.cnblogs.com/charlesblc/p/6083687.html 需要用Intellij导入一个已有工程.源文件原始内容也可见:link ...

  5. Spring AOP 切点 Pointcut 表达式介绍与使用

    一.前言 面向切面编程 AOP 是一种常见的编程思想,是面向对象编程的一种补充,AOP 框架通过修改源代码,将处理逻辑编织到指定的业务模块中 常见的处理比如:在方执行法前进行校验,在方法执行后进行日志 ...

  6. Spring AOP源码解析——AOP动态代理原理和实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...

  7. 跟着小马哥学系列之 Spring AOP(基于 XML 定义 Advice 源码解析)

    学好路更宽,钱多少加班. --小马哥 简介 大家好,我是小马哥成千上万粉丝中的一员!2019年8月有幸在叩丁狼教育举办的猿圈活动中知道有这么一位大咖,从此结下了不解之缘!此系列在多次学习极客时间< ...

  8. java aop管理权限_基于spring aop 权限管理系统原型 - andyj2ee - BlogJava

    此权限管理系统把待访问的业务层方法做为权限管理中的资源,通过spring aop 对接口方法进行拦截,来实现权限的管理,可以实现细粒度的权限控制. 在上文体验了spring aop 一些特性,aop ...

  9. Spring AOP中是如何注册Advisor的?

    前置博文: Spring AOP中如何为Bean创建代理? Spring AOP中是如何注册Advisor的? Spring AOP如何为目标方法创建拦截器链? Spring AOP拦截器调用的实现 ...

最新文章

  1. VTK:PolyData之VertexConnectivity
  2. Kettle使用_17 计算器生成时间维度数据
  3. useradd、adduser和userdel在使用时的注意事项
  4. Oracle 标准大页和透明大页
  5. Linux 内核 up down,信号量机制中的DOWN操作与UP操作详解
  6. OpenCV:简单计算曲线弧度-弓形弧度
  7. 美团技术:交易平台建设实践(视频+胶片)
  8. Java关键字(六)——super
  9. S3C2440系统中断
  10. pyqt5使用label显示图片
  11. request.getRequestURL()和request.getRequestURI()区别
  12. Visual studio 2013 连接MySQL数据库的设置。
  13. 代码分析系列 数3退1
  14. 数据挖掘:计算边的中介中心值 edge_betweenness value
  15. t3系统建账请到服务器端修改,用友T3标准版常见问题及处理方法(一)
  16. 【校招VIP】产品行测之逻辑计算题
  17. springBoot添加日志管理
  18. 数据库中,DDL,DQL,DML,DCL是什么意思?
  19. duration java_Java Duration类| 带示例的multipliedBy()方法
  20. opj线性表Placing apples 题解

热门文章

  1. mysql的单行注释_MySQL基础--会这些就够了
  2. 机器学习笔记 invariance data augmentation
  3. Python应用实战案例-一文通读时间序列在Python中的应用
  4. tableau必知必会之妙用 Lookup 函数同时跨行跨列取数
  5. java.lang.UnsatisfiedLinkError解决方法汇集
  6. python开发的前景_python开发前景怎么样
  7. Fiddler抓取手机APP数据包
  8. 1号店11.11:分布式搜索引擎的架构实践
  9. Kafka设计解析(二):Kafka High Availability (上)-转
  10. akka---Getting Started Tutorial (Java): First Chapter