课程咨询 :18487146383

  • java程序员:代理模式

    发布:昆明Java培训      来源:达内新闻      时间:2016-09-28

  • 昆明Java培训机构的老师今天给大家讲java的代理模式

    1、静态代理

    1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。

    public interface IUserDao {

    void save();

    }

    1.2被代理的类,目标对象

    public class UserDao implements IUserDao{

    @Override

    public void save() {

    System.out.println("-----已经保存数据!!!------");

    }

    }

    1.3代理对象

    public class UserDaoProxy implements IUserDao{

    //接收保存目标对象

    private IUserDao target;

    public UserDaoProxy(IUserDao target) {

    this.target = target;

    }

    @Override

    public void save() {

    System.out.println("开始事务...");

    target.save();            //执行目标对象的方法

    System.out.println("提交事务...");

    }

    }

    1.4测试类

    public class App {

    public static void main(String[] args) {

    //目标对象

    IUserDao target = new UserDao();

    //代理

    IUserDao proxy = new UserDaoProxy(target);

    proxy.save(); //执行的是,代理的方法

    }

    }

    2、动态代理

    2.1同样的,动态代理也需要完成一个接口。(同上)

    2.2目标对象也是相同的。

    2.3只是在代理对象上有所不同

    public class ProxyFactory {

    //维护一个目标对象

    private Object target;

    public ProxyFactory(Object target){

    this.target = target;

    }

    //给目标对象,生成代理对象 

    public Object getProxyInstance() {

    return Proxy.newProxyInstance(

    target.getClass().getClassLoader(),

    target.getClass().getInterfaces(),

    new InvocationHandler() {

    @Override

    public Object invoke(Object proxy, Method method, Object[] args)

    throws Throwable {

    System.out.println("开启事务");

    //执行目标对象方法

    Object returnValue = method.invoke(target, args);   

    System.out.println("提交事务");

    return returnValue;

    }

    });

    }

    }

    2.4测试类

    public class App {

    public static void main(String[] args) {

    //目标对象

    IUserDao target = new UserDao();

    System.out.println(target.getClass());

    //给目标对象,创建代理对象

    IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();

    System.out.println(proxy.getClass());

    //执行方法  【代理对象】

    proxy.save();

    }

    }

    3、cglib代理

    3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。

    3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。

    public class ProxyFactory implements MethodInterceptor{

    //维护目标对象

    private Object target;

    public ProxyFactory(Object target){

    this.target = target;

    }

    //给目标对象创建代理对象

    public Object getProxyInstance(){

    //1.工具类

    Enhancer en = new Enhancer();

    //2.设置父类

    en.setSuperclass(target.getClass());

    //3.设置回调函数

    en.setCallback(this);

    //4.创建子类(代理对象)

    return en.create();

    }

    @Override

    public Object intercept(Object obj, Method method, Object[] args,

    MethodProxy proxy) throws Throwable {

    System.out.println("开始事务.....");

    //执行目标对象的方法

    Object returnValue = method.invoke(target, args);

    System.out.println("提交事务.....");

    return returnValue;

    }

    }

    3.3测试类

    public class App {

    public static void main(String[] args) {

    //目标对象

    UserDao target = new UserDao();

    System.out.println(target.getClass());

    //代理对象

    UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();

    System.out.println(proxy.getClass());

    //执行代理对象的方法

    proxy.save();

    }

    }

    学Java开发就到昆明达内Java培训班!了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!         

上一篇:使用泛型对java数组扩容

下一篇:你是哪种类型的程序员

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:7月31日

Java--零基础业余班

Java--零基础业余班

开班日期:7月31日

Java--周末提升班

Java--周末提升班

开班日期:7月31日

Java--零基础周末班

Java--零基础周末班

开班日期:7月31日

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:18487146383    全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56