aop详解(二)

上篇讲了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方法
          
      
    }  
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值