spring AOP 环绕增强小Demo

前面写了一个前置增强,后置增强的小demo,前置增强即在方法调用前对方法增强;后置增强即在方法调用后对方法增强。环绕增强允许在目标类方法调用前后织入横切逻辑,它综合了前置、后置增强两者的功能。

还继续沿用之前的代码,这里介绍环绕增强的实现类和测试类。

环绕增强类
GreetingAroundAdvice.java

package com.paic.zhangqi.spring.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

public class GreetingAroundAdvice implements MethodInterceptor {

	@Override
	public Object invoke(MethodInvocation invocation) throws Throwable {

		// 获取目标方法入参
		Object[] args = invocation.getArguments();
		String clientName = (String)args[0];

		// 目标方法调用前执行
		System.out.println("How are you!Mr."+clientName+".");

		// 通过反射机制调用目标方法
		Object obj = invocation.proceed();

		// 目标方法调用后执行
		System.out.println("Please enjoy yourself!");

		return obj;
	}

}

环绕增强的代码和前面前置增强代码有一个不同处,所实现的接口包路径改变了。前置增强、后置增强实现的接口在org.springframework.aop 路径下,而环绕增强类需要实现org.aopalliance.intercept.MethodInterceptor

接口。这个接口不是 Spring 提供的,它是
AOP 联盟写的,Spring 只是借用了它。该接口拥有唯一的接口方法Object invoke(MethodInvocation invocation) throws Throwable ,MethodInvocation 不但封装目标方法及其入参数组,还封装了目标方法所在的实例对象,通过MethodInvocation
的 getArguments() 方法可以获取目标方法的入参数组,通过proceed() 反射调用目标实例相应的方法。通过在实现类中定义横切逻辑,很容易实现方法的前后置的增强。

测试类
TestAdvice.java

package com.paic.zhangqi.spring.aop;

import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.framework.ProxyFactory;

public class TestAdvice {

	public static void main(String[] args) {

		Waiter target = new NaiveWaiter();

		// 环绕增强类
		MethodInterceptor aroundAdvice = new GreetingAroundAdvice();

		// spring 提供的代理工厂
		ProxyFactory pf = new ProxyFactory();

		// 设置代理目标
		pf.setTarget(target);

		// 为代理目标添加增强
		pf.addAdvice(aroundAdvice);

		// 生成代理实例
		Waiter proxy = (Waiter)pf.getProxy();

		proxy.greetTo("John");
		proxy.serveTo("Tomcat");

	}
}

输出结果

log4j:WARN No appenders could be found for logger (org.springframework.aop.framework.CglibAopProxy).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
How are you!Mr.John.
greet to John...
Please enjoy yourself!
How are you!Mr.Tomcat.
serving Tomcat...
Please enjoy yourself!
时间: 2024-11-07 23:49:30

spring AOP 环绕增强小Demo的相关文章

spring AOP之增强类型

> spring使用增强类定义横切逻辑,同时由于spring只支持方法连接点,增强还包括了在方法的哪一点加入横切代码的方位信息,所以增强既包含横切逻辑,还包含部分连接点的信息. spring目前支持5种类型增强: 前置增强:org.springframework.aop.BeforeAdvice代表前置增强,因为spring只支持方法级的增强,所以MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定义的. 后

Spring学习(二十五)Spring AOP之增强介绍

课程概要: Spring AOP的基本概念 Spring AOP的增强类型 Spring AOP的前置增强 Spring AOP的后置增强 Spring AOP的环绕增强 Spring AOP的异常抛出增强 Spring AOP的引介增强 一.Spring AOP增强的基本概念 Spring当中的专业术语-advice,翻译成中文就是增强的意思. 所谓增强,其实就是向各个程序内部注入一些逻辑代码从而增强原有程序的功能. 二.Spring AOP的增强类型 首先先了解一下增强接口的继承关系 如上图

springBoot AOP环绕增强、自定义注解、log4j2、MDC

(一)log4j2 maven配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 切换log4j2日志读取 --> <exclusion> <groupId>org.springframework.b

spring AOP 前置增强,后置增强小Demo

服务员接口 Waiter.java package com.paic.zhangqi.spring.aop; public interface Waiter { void greetTo(String name); void serveTo(String name); } 服务员接口实现类 NaiveWaiter.java package com.paic.zhangqi.spring.aop; public class NaiveWaiter implements Waiter { @Over

Spring AOP 创建增强类

AOP联盟为增强定义了org.aopalliance.aop.Advice接口,Spring支持5种类型的增强:  1)前置增强:org.springframework.aop.BeforeAdvice 代表前置增强,因为Spring 只支持方法级的增强,所有MethodBeforeAdvice是目前可用的前置增强,表示在目标方法执行前实施增强,而BeforeAdvice是为了将来版本扩展需要而定义的:  2)后置增强:org.springframework.aop.AfterReturning

Spring aop——前置增强和后置增强 使用注解Aspect和非侵入式配置

AspectJ是一个面向切面的框架,它扩展了java语言,定义了AOP语法,能够在编译期提供代码的织入,所以它有一个专门的编译器用来生成遵守字节码字节编码规范的Class文件 确保使用jdk为5.0以上版本. 01.使用注解标注增强(AspectJ)  :取代了配置文件中的aop:pointcut节点的配置 添加jar和log4j的配置文件 aspectj-1.8.7.jar aspectjweaver.jar 添加头文件: xmlns:aop="http://www.springframewo

spring aop环绕通知记录应用的日志

使用的框架是spring mvc+spring 最近想利用spring aop的环绕通知来处理web的日志问题,总的来讲,如果在controller层做切入,则难监控实际运行情况,在service层做切入,则只能监控到service层的情况,通过捕捉service抛出的异常来记录日志,对于目前本人应用而言,已经足够了,先将记录如下: 代码: @Component @Aspect public class ExceptionLog { /** * 61 * 环绕通知需要携带ProceedingJo

spring AOP 前后增强 实现的接口

执行前增强:org.springframework.aop.MethodBeforeAdvice,重写方法:public void before(Method args0,Object[] args1,Object args2); 执行后增强:org.springframework.aop.AfterReturningAdvice,重写方法:public void afterReturning(Object args0,Method args1,Object[] args2); 方法任意增强.前

(转)Spring AOP编程原理、Demo

转自: http://pandonix.iteye.com/blog/336873/ Spring AOP 详解 此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP 来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 对部分函数的调用进行日志记录