1:理解代理模式:
像Spring MVC 一样,一个项目完成你都不会见到一句与事物有关的代码,这是因为Spring MVC使用了AOP面向切面编程,而AOP就是典型的代理模式的提现,spring将所有Service层横切,通过事物代理类来处理后续程序SQL与数据库的关系。代理模式有两种,JDK动态代理,CGLIB代理。JDK动态代理只能代理接口中的方法,所有必须要提供,CGLIB是生成子类,不需要接口。
JDK动态代理例子:
/**
*接口
*/
package com.app.test;
public interface TestService {
public void test();
public void test1();
}
/**
*接口实现
*/
package com.app.test;
public class TestServiceImpl implements TestService{
public void test() {
System.out.println("JDK代理模式测试");
}
public void test1() {
System.out.println("JDK代理模式测试1");
}
}
/**
*代理类
*/
package com.app.test;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class TestProxy implements InvocationHandler{
private Object object;
public TestProxy(Object object){
this.object = object;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
System.out.println("1");
result = method.invoke(object, args);
System.out.println("2");
return result;
}
public static Object invoke(Object object){
Class<? extends Object> clazz = object.getClass();
//ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),new TestProxy(object));
}
}
/**
*测试类
*/
package com.app.test;
public class Test {
public static void main(String[] args) {
TestService testServiceImpl = new TestServiceImpl();
TestService testService = (TestService) TestProxy.invoke(testServiceImpl);
testService.test();
testService.test1();
}
}
CGLIB代理:
package com.app.test;
/**
* 普通类
* @author Administrator
*
*/
public class CGLIBClass {
public void test(){
System.out.println("CGLIB测试");
}
}
package com.app.test;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* CGLIB代理类
* @author Administrator
*
*/
public class CGLIBProxy implements MethodInterceptor{
@SuppressWarnings("rawtypes")
public Object getCGLIBProxy(Class clz){
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(clz);
enhancer.setCallback(this);
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("1");
Object object = proxy.invokeSuper(obj, args);
System.out.println("2");
return object;
}
}
package com.app.test;
/**
* 测试类
* @author Administrator
*
*/
public class CGLIBTest {
public static void main(String[] args) {
CGLIBProxy cglibProxy = new CGLIBProxy();
CGLIBClass cglibClass =(CGLIBClass) cglibProxy.getCGLIBProxy(CGLIBClass.class);
cglibClass.test();
}
}