日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringAPI手动创建代理对象——ProxyFactory

發(fā)布時間:2023/11/29 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringAPI手动创建代理对象——ProxyFactory 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

可以通過注解的方式來自定義代理對象的創(chuàng)建,同時也可以通過SpringAPI,手動編程的方式來創(chuàng)建代理對象。

幾個重要的API:

ProxyFactory\MethodInterceptor\Advice\AfterReturningAdvice\MethodBeforeAdvice

直接粘貼代碼,代碼能說明一切:


/**
*
*/
package cn.hessian.proxy;

import java.lang.reflect.Method;

import org.aopalliance.intercept.Interceptor;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.junit.Test;
import org.springframework.aop.AfterAdvice;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;

import cn.hessian.service.HelloWorldService;
import cn.hessian.service.impl.HelloWorldServiceImpl2;

/**
* @author beijing
* 2013-4-2
*/
public class SpringProgramicProxyDemo {

??? @Test
??? public void test(){
??????? //代理對象需要的實現的接口
??????? Class[] interfaces=new Class[]{HelloWorldService.class};
??????? //利用spring的API,創(chuàng)建代理工廠
??????? ProxyFactory proxyFactory=new ProxyFactory(interfaces);
??????? //設置目標對象
??????? proxyFactory.setTarget(new HelloWorldServiceImpl2());
??????? /**
???????? * Set whether proxies created by this configuration should be prevented from being cast to Advised to query proxy status.
??????????? Default is "false", meaning that any AOP proxy can be cast to Advised.
???????? * */
??????? proxyFactory.setOpaque(true);
?????? //添加方法前置通知
??????? proxyFactory.addAdvice(new MethodBeforeAdvice() {
??????????? @Override
??????????? public void before(Method method, Object[] args, Object target)
??????????????????? throws Throwable {
??????????????? System.out.println("1111111111在方法調用之前攔截");
??????????? }
??????? });
??????? //可以添加多個方法前置或者后置通知
??? proxyFactory.addAdvice(new MethodBeforeAdvice() {
???????????
??????????? @Override
??????????? public void before(Method method, Object[] args, Object target)
??????????????????? throws Throwable {
??????????????? System.out.println("22222222在方法調用之前攔截");
??????????? }
??????? });
?? //可以添加多個方法前置或者后置通知
??????? proxyFactory.addAdvice(new AfterReturningAdvice() {
???????????
??????????? @Override
??????????? public void afterReturning(Object returnValue, Method method,
??????????????????? Object[] args, Object target) throws Throwable {
??????????????? System.out.println("方法完成之后調用的方法11111");
???????????????
??????????? }
??????? });
???????
?????? //可以添加多個方法前置或者后置通知
??????? proxyFactory.addAdvice(new AfterReturningAdvice() {
???????????
??????????? @Override
??????????? public void afterReturning(Object returnValue, Method method,
??????????????????? Object[] args, Object target) throws Throwable {
??????????????? System.out.println("方法完成之后調用的方法22222");
???????????????
??????????? }
??????? });
?????

? //對于環(huán)繞通知只能添加一個,多添加也是沒有用的,spring會選第一個advice,請看結果

??????? proxyFactory.addAdvice(new MethodInterceptor() {
???????????
??????????? @Override
??????????? public Object invoke(MethodInvocation invocation) throws Throwable {
??????????????? System.out.println("1111111環(huán)繞通知");
??????????????? Object[] params=invocation.getArguments();
??????????????? Method method=invocation.getMethod();
??????????????? Object target=invocation.getThis();
??????????????? Object bytes=method.invoke(target, params);
??????????????? byte[] result=(byte[]) bytes;
??????????????? System.out.println("1111111111環(huán)繞通知生成的結果--"+new String(result));
??????????????? return "北京生活圈".getBytes();
??????????? }
??????? });
???????
?????? //對于環(huán)繞通知只能添加一個,多添加也是沒有用的,spring會選第一個advice,請看結果
proxyFactory.addAdvice(new MethodInterceptor() {
???????????
??????????? @Override
??????????? public Object invoke(MethodInvocation invocation) throws Throwable {
??????????????? System.out.println("22222環(huán)繞通知");
??????????????? Object[] params=invocation.getArguments();
??????????????? Method method=invocation.getMethod();
??????????????? Object target=invocation.getThis();
??????????????? Object bytes=method.invoke(target, params);
??????????????? byte[] result=(byte[]) bytes;
??????????????? System.out.println("222222環(huán)繞通知生成的結果--"+new String(result));
??????????????? return bytes;
??????????? }
??????? });
???????
???????
??????? Object proxy=proxyFactory.getProxy(proxyFactory.getClass().getClassLoader());
???????
??????? Class[] inters=proxy.getClass().getInterfaces();
??????? for(Class str: inters ){
??????????? System.out.println(str.getSimpleName());
??????? }
???????
??????? HelloWorldService helloWorldService=(HelloWorldService)proxy;
??????? System.out.println(new String(helloWorldService.sayHelloWorld("北京")));
??? }
}

?



生成的結果為:

HelloWorldService
SpringProxy
1111111111在方法調用之前攔截
22222222在方法調用之前攔截
1111111環(huán)繞通知
1111111111環(huán)繞通知生成的結果--你好 北京
方法完成之后調用的方法22222
方法完成之后調用的方法11111
北京生活圈

轉載于:https://my.oschina.net/hotbain/blog/119420

總結

以上是生活随笔為你收集整理的SpringAPI手动创建代理对象——ProxyFactory的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。