DBMNG数据库管理与应用

书籍是全世界的营养品。生活里没有书籍,就好像没有阳光;智慧里没有书籍,就好像鸟儿没有翅膀。
当前位置:首页 > 经验分享 > Java组件

SpringAOP的代理模式

代理模式

JDK动态代理:

是Spring最基本的代理,和CGLIB不一样的事JDK动态代理只能代理接口(返回的代理对象为目标类所实现的接口类型),不能代理类,这样,要代理的每一个对象都必须实现至少一个接口

CGLIB:

是一种类级别的代理对象,针对字节码进行代理的,不需要对每一个方法都进行拦截,判断。从性能上讲,CGLIB优于JDK动态代理。


-------------------------------------代理模式------------------------------------------------------------

1. 定义一个接口

2。创建一个被代理类 实现 接口

3. 创建调用类 实现 InvocationHandler接口 里面设置一个用于保存 代理类的 参数

4.代理类 通过 newProxy.newProxyInstance(...) 生成一个新的代理类,返回的是根据被代理类所实现的接口类型

 参数 1  被代理类的加载  2 被代理类所实现的接口  3 InvocationHandler类的实例(记得属性保存代理类)


code:

-----------------------------------------------------------------------------------------------------------

creater a interface 


public interface HandlerInter {
    public void Handle(Object obj);

}

-----------------------------------------------------------------------------------------------------------

creater a ByProxyClass


import com.ye.inter.HandlerInter;

public class ByProxyObject implements HandlerInter{

    public void Handle(Object obj) {
    System.out.println("被代理对象执行");
        
-----------------------------------------------------------------------------------------------------------

creater a invocationhandler 


//调用类
public class ProxyInvocation implements InvocationHandler {
    private Object proobj;        //保存代理类
    //当代理类执行代理方法时候,自动调用该方法
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        String message = (String) args[0];
        System.out.println("通知:在目标方法前拿到传递进来的参数:"+message);
        Object obj  = method.invoke(proobj, args);    //调用目标方法 切入点
        System.out.println("通知:目标方法执行后的通知");
        return obj;
    }
    public Object getProobj() {
        return proobj;
    }
    public void setProobj(Object proobj) {
        this.proobj = proobj;
    }   
}

-----------------------------------------------------------------------------------------------------------

Test


import org.junit.Test;

import com.ye.inter.HandlerInter;
import com.ye.invocation.ProxyInvocation;
import com.ye.pojo.ByProxyObject;

public class Testing {
    @Test
    public void TestProxy(){
        ByProxyObject bpo = new ByProxyObject();    //被代理类
        ProxyInvocation pi = new ProxyInvocation();
        pi.setProobj(bpo);    //调用类保存代理类
        HandlerInter hi = (HandlerInter) Proxy.newProxyInstance(bpo.getClass().getClassLoader(), bpo.getClass().getInterfaces(),
                pi);
        hi.Handle(new String("Hello  代理类"));    //连接点
        
    }

}

本站文章内容,部分来自于互联网,若侵犯了您的权益,请致邮件chuanghui423#sohu.com(请将#换为@)联系,我们会尽快核实后删除。
Copyright © 2006-2023 DBMNG.COM All Rights Reserved. Powered by DEVSOARTECH            豫ICP备11002312号-2

豫公网安备 41010502002439号