Spring 代理
对象代理,就是一个对象代表另一个对象来完成具体业务功能。


静态代理
静态代理是通过编码实现的,设计模式中有代理模式就是静态代理的一个例子。
java
package com.hk.eshop.proxy;
public interface Subject {
public String request();
}
package com.hk.eshop.proxy;
public class RealSubject implements Subject{
public String request() {
return "RealSubject";
}
}
package com.hk.eshop.proxy;
public class ProxySubject implements Subject{
public String request() {
try
{
Subject subject = new RealSubject();
long start = System.currentTimeMillis();
Thread.sleep(300);
String rtn = subject.request();
long end = System.currentTimeMillis();
return rtn +" kill time ("+(end-start)+")ms";
}
catch(Exception e)
{
e.printStackTrace();
}
return null;
}
}
package com.hk.eshop.proxy;
public class Main
{
public static void main(String[] args)
{
Subject subject = new ProxySubject();
String rtn = subject.request();
System.out.println(rtn);
}
}

动态代理
动态代理是在运行时动态扩展一个接口或一个类功能的技术。






java
package com.hk.eshop.java;
public interface IUserMng {
public void save(String id,String name);
public void find(String id);
}
package com.hk.eshop.java;
public class UserMng implements IUserMng{
public void save(String id, String name) {
System.out.println("save() id="+id+",name="+name);
}
public void find(String id) {
System.out.println("find() id="+id);
}
}
package com.hk.eshop.java;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxy implements InvocationHandler {
private Object targetObject;
public Object createProxyInstance(Object targetObject)
{
this.targetObject = targetObject;
return Proxy.newProxyInstance(
targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this
);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().contains("save"))
audit(method,args);
Object rtn = null;
rtn = method.invoke(this.targetObject,args);
System.out.println("返回值:="+rtn);
return rtn;
}
public void audit(Method method, Object[] args)
{
System.out.println("触发方法......"+method.getName());
System.out.println("方法审计开始......");
for(int i=1;i<=args.length;i++)
System.out.println("第"+i+"个参数="+args[i-1]);
System.out.println("方法审计结束......");
}
}
package com.hk.eshop.java;
public class Main
{
public static void main(String[] args)
{
IUserMng userMng = new UserMng();
JdkProxy proxy = new JdkProxy();
IUserMng userMng2 = (IUserMng)proxy.createProxyInstance(userMng);
userMng2.find("1");
userMng2.save("1","java");
}
}




基于类的CgLib动态代理
CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。