上篇讲了aop的原理以及使用jdk代理实现aop.
但是使用Jdk代理有局限性,就是必须要有借口,代理是绑定在接口的,所以就产生了cglib动态代理机制实现。
1)添加一个类
public class ClientBean {
private String name = null;
public ClientBean()
{
}
public ClientBean(String name)
{
this.name = name;
}
public void addClient()
{
System.out.println("this is addClient() method!");
}
public void deleteClient()
{
System.out.println("this is deleteClient() method!");
}
public void getClient()
{
System.out.println("this is getClient() method!");
}
public void updateClient()
{
System.out.println("this is updateClient() method!");
}
public String getClientName()
{
return name;
}
public void setClientName(String name)
{
this.name = name;
}
}
2)代理类
public class CGLibProxy implements MethodInterceptor{
private Object targetObject;
//是针对类来实现代理的,它的原理是根据目标类生成它的一个子类,并覆盖其中的方法实现增强,但因为是继承,所以无法代理final修饰的类
public Object createProxyObject(Object targetObject)
{
this.targetObject = targetObject;
Enhancer enhancer = new Enhancer(); //申明增强类的实例
enhancer.setSuperclass(this.targetObject.getClass()); //设置被代理类的字节码,cglib根据被代理类的字节码生成子类
enhancer.setCallback(this); //设置回调函数,即一个方法拦截
//通过create方法返回类的代理
return enhancer.create();
}
//methodProxy jdk的java.lang.reflect.method的Method的类的代理类,方便实现被代理类的方法的调用
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
{
ClientBean clientBean = (ClientBean)targetObject;
String userName = clientBean.getClientName();
Object result = null;
if(userName != null && !"".equals(userName))
{
result = method.invoke(targetObject, args);
}
System.err.println("After...");
return result;
}
}
3)测试类
public class ProxyExe {
public static void main(String[] args)
{
/* System.out.println(".............CGLIB Proxy....................");
System.out.println("Proved...................."); */
CGLibProxy cproxy = new CGLibProxy();
ClientBean clientBean = (ClientBean)cproxy.createProxyObject(new ClientBean("Bob Liang")); 首先生成代理类
clientBean.addClient(); 调用方法时,触发Invoke方法
}
}