了解代理模式

本文介绍了一个Java代理模式的实现案例,包括定义接口、实现类、动态代理类及测试类。通过示例展示了如何使用JDK动态代理和CGLIB实现方法调用前后的日志记录及事务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.建立一个接口类和实现类


package cn.mldn.dao;

import cn.mldn.vo.User;

import java.util.List;

/**
 * Created by wq on 2017/9/18.
 */
public interface IUserDAO {
    public void doCreate(User vo) throws Exception;
    public void doUpdate(User vo) throws Exception;
    public void doRemove(String  name) throws Exception;
    public User findByName(String name) throws Exception;
    public List<User> findAll() throws  Exception;

}
package cn.mldn.dao.impl;

import cn.mldn.dao.IUserDAO;
import cn.mldn.vo.User;

import java.util.List;

/**
 * Created by wq on 2017/9/18.
 */
public class UserDAOImpl implements IUserDAO {
    @Override
    public void doCreate(User vo) throws Exception {
        System.out.println("【增加数据:doCreate】"+vo);
    }

    @Override
    public void doUpdate(User vo) throws Exception {
        System.out.println("【修改数据:doUpdate】"+vo);
    }

    @Override
    public void doRemove(String name) throws Exception {
        System.out.println("【删除数据:doRemove】"+name);
    }

    @Override
    public User findByName(String name) throws Exception {
        System.out.println("【查询数据:findByName】"+name);

        return null;
    }

    @Override
    public List<User> findAll() throws Exception {
        System.out.println("【查询数据:findAll】");
        return null;
    }
}
2.建立代理类


package cn.mldn.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by wq on 2017/9/23.
 */
public class DAOProxy implements InvocationHandler{
private Object target; //要代理的对象信息
    //需要由系统生产一个指定接口的代理类对象
public Object bind(Object target){
    this.target=target;
//返回与当前传入对象结构相同的代理对象

     return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    //取得当前执行的方法的名称
            this.log(method.getName());

            Object retObj = method.invoke(this.target,args);

            //如果是更新则进行事物处理
            if (method.getName().matches("do[a-zA-Z0-9]+")){
                this.commit();
            }

        return retObj;
    }
    public  void log(String methodName){
        System.out.println("进行日志记录 ,方法:"+methodName);
    }

    public  void commit(){
        System.out.println("事务提交。");
    }


}

3.建立代理测试类

package cn.mldn.test;

import cn.mldn.dao.IUserDAO;
import cn.mldn.dao.impl.UserDAOImpl;
import cn.mldn.dao.proxy.UserDAOProxy;

/**
 * Created by wq on 2017/9/17.
 */

public class ProxyDemo {
    public static  void main(String[] args ) throws Exception {
        IUserDAO dao=(IUserDAO) new UserDAOProxy().bind(new UserDAOImpl());
        dao.doCreate(null);
        dao.findByName("hello");
    }

}
传入的是接口,如果没有接口则会出现错误 所以用cglib包进行设计
以下是:

代理测试类
package cn.mldn.test;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * Created by wq on 2017/9/24.
 */
class  Hello{
    public void print(){
        System.out.println("中午了,肚子饿了吧?听晕了不");
    }
}




public class CGLIBProxyDemo {
    public static  void main(String[] args ) throws Exception {
     final Hello hello = new Hello();

     //代理类对象
        Enhancer enhancer = new Enhancer();
        //为代理类设置一个父类
        enhancer.setSuperclass(Hello.class);
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
                System.out.println("******************");

                return method.invoke(hello,objects);
            }
        });
        //返回代理类对象
       Hello temp= (Hello) enhancer.create();
        temp.print();
    }

    }

成功:
本案例导入的包为cglib-2.1.3.jar
和asm.jar   已经上传自行下载












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值