能夠經過註解的方式來自定義代理對象的建立,同時也能夠經過SpringAPI,手動編程的方式來建立代理對象。java
幾個重要的API:spring
ProxyFactory\MethodInterceptor\Advice\AfterReturningAdvice\MethodBeforeAdvice編程
直接粘貼代碼,代碼能說明一切:ide
/**
*
*/
package cn.hessian.proxy;ui
import java.lang.reflect.Method;this
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;.net
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,建立代理工廠
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");
}
});
接口
//對於環繞通知只能添加一個,多添加也是沒有用的,spring會選第一個advice,請看結果
proxyFactory.addAdvice(new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("1111111環繞通知");
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環繞通知生成的結果--"+new String(result));
return "北京生活圈".getBytes();
}
});
//對於環繞通知只能添加一個,多添加也是沒有用的,spring會選第一個advice,請看結果
proxyFactory.addAdvice(new MethodInterceptor() {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("22222環繞通知");
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環繞通知生成的結果--"+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環繞通知
1111111111環繞通知生成的結果--你好 北京
方法完成以後調用的方法22222
方法完成以後調用的方法11111
北京生活圈