javascript
Spring-AOP 通过配置文件实现 环绕增强
文章目錄
- 概述
- 實例
概述
環(huán)繞增強允許在目標(biāo)類方法調(diào)用前后織入橫切邏輯,它綜合實現(xiàn)了前置,后置增強兩者的功能.
實例
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
下面是我們用環(huán)繞增強同時實現(xiàn)上面的我們的示例。步驟如下:
創(chuàng)建業(yè)務(wù)接口類:Waiter.java
創(chuàng)建業(yè)務(wù)實現(xiàn)類:NativeWaiter.java
創(chuàng)建業(yè)務(wù)增強類:GreetingInterceptor.java
創(chuàng)建配置文件:conf-advice.xml
創(chuàng)建增強測試類:MethodInterceptorTest.java
業(yè)務(wù)接口類
package com.xgj.aop.spring.advice.methodInterceptor;public interface Waiter {void greetTo(String name);void serverTo(String name); }業(yè)務(wù)實現(xiàn)類
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);}}業(yè)務(wù)增強類GreetingInterceptor.java
package com.xgj.aop.spring.advice.methodInterceptor;import org.aopalliance.intercept.MethodInterceptor; import org.aopalliance.intercept.MethodInvocation;public class GreetingInterceptor implements MethodInterceptor {/*** 截取目標(biāo)類方法的執(zhí)行,并在前后添加橫切邏輯* * @param invocation* 封裝了目標(biāo)方法和入?yún)?shù)組以及目標(biāo)方法所帶的實例對象* @return 代理對象* @throws Throwable*/@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {// 獲取目標(biāo)方法的入?yún)?/span>Object[] args = invocation.getArguments();// 在目標(biāo)方法執(zhí)行前調(diào)用String clientName = (String) args[0];System.out.println("GreetingInterceptor:How are you!" + clientName);// 利用反射機制來調(diào)用目標(biāo)方法Object object = invocation.proceed();// 在目標(biāo)方法執(zhí)行后調(diào)用System.out.println("GreetingInterceptor: please enjoy youself!");return object;}}Spring直接使用AOP聯(lián)盟所定義的MethodInterceptor作為環(huán)繞增強的接口,該接口擁有唯一的接口方法
public Object invoke(MethodInvocation invocation) throws ThrowableMethodInvocation不但封裝了目標(biāo)方法及其入?yún)?shù)組,還封裝了目標(biāo)方法所在的實例對象。通過MethodInvocation的getArguments()方法可以獲取到目標(biāo)方法的入?yún)?shù)組,通過proceed()方法反射調(diào)用目標(biāo)實例相應(yīng)的方法。
通過在實現(xiàn)類中定義橫切邏輯可以很容易的實現(xiàn)方法前后的增強。
接下來在配置文件中對其進(jìn)行配置:
<?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");}}運行結(jié)果
可見環(huán)繞增強起了作用。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Spring-AOP 通过配置文件实现 环绕增强的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-AOP 通过配置文件实现
- 下一篇: gradle idea java ssm