前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring-AOP 通过配置文件实现 环绕增强

Spring-AOP 通过配置文件实现 环绕增强

作者头像
小小工匠
发布2021-08-16 16:39:44
3760
发布2021-08-16 16:39:44
举报
文章被收录于专栏:小工匠聊架构

文章目录

概述

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


实例

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

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

业务接口类

代码语言:javascript
复制
package com.xgj.aop.spring.advice.methodInterceptor;

public interface Waiter {

	void greetTo(String name);

	void serverTo(String name);
}

业务实现类

代码语言:javascript
复制
package com.xgj.aop.spring.advice.methodInterceptor;

public class NaiveWaiter implements Waiter {

	@Override
	public void greetTo(String name) {
		System.out.println("greetTo " + name);
	}

	@Override
	public void serverTo(String name) {
		System.out.println("serverTo " + name);
	}

}

业务增强类GreetingInterceptor.java

代码语言:javascript
复制
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
	 */
	@Override
	public 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作为环绕增强的接口,该接口拥有唯一的接口方法

代码语言:javascript
复制
public Object invoke(MethodInvocation invocation) throws Throwable

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

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


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

代码语言:javascript
复制
<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>

编写单元测试

代码语言:javascript
复制
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 {

	@Test
	public 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");
	}

}

运行结果

可见环绕增强起了作用。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017/08/15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 概述
  • 实例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档