静态代理,jdk动态代理和cjlib动态代理

来源:互联网 发布:ubuntu查看显卡使用率 编辑:程序博客网 时间:2024/06/06 07:08

1.静态代理

//抽象主题public interface ISubject {    //定义一个方法,request    public void request(); }  //准备一个真实主题和一个代理主题 public class RealSubject implements ISubject{    public void request() {        System.out.println("我是主业务");    }}public class ProxySubject implements ISubject{    //构造一个真是主题并进行封装    private RealSubject real;//定义一个方法    public void request() {        //code        System.out.println("before");        real.request();        //code        System.out.println("after");    }    public RealSubject getReal() {        return real;    }    public void setReal(RealSubject real) {        this.real = real;    }} @Test    /**     * 静态代理测试     */    public void staticproxyTest(){        ProxySubject proxy=new ProxySubject();        //准备一个真实主题,他在后期代码中会作为代理对象的属性        RealSubject real=new RealSubject();        proxy.setReal(real);        proxy.request();    }

2.jdk动态代理

//定义一个接口public interface IUserDAO { public String add(); public String edit();}public class UserDAOImpl implements IUserDAO{ public String add() { //开启事务 System.out.println("add ok!"); return "add"; //logger } public String edit() { //开启事务 System.out.println("edit ok!"); return "edit"; //开启事务 }}@Test /** * jdk动态代理测试 */ public void staticproxyTest() { //01.先创建出接口实现类 final IUserDAO dao=new UserDAOImpl();//该代理类具有 final 和 public 修饰符,意味着它可以被所有的类访问,但是不能被再度继承 //02.类Proxy IUserDAO proxy=(IUserDAO) Proxy .newProxyInstance(dao.getClass() //获取实现类的类加载器 //dao.getClass()或者写成UserDaoImpl.class().getClassLoader() .getClassLoader(), dao.getClass(). // getInterfaces(), // 获取实现类接口 new InvocationHandler() { //Invocation(调用 ) Handler (处理) @Override /**proxy 代理对象 不能用 如果用了就会无限循环 * method 被代理对象 方法 add() * args add方法的参数 (代理对象的方法参数) */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //code 1 System.out.println("start Tran"); //真正业务 //执行dao对象的add方法,传入的是args参数,返回值是result Object result = method.invoke(dao, args); //code 2 System.out.println("write logger"); return result; } }); String add = proxy.add(); System.out.println("======="+add+"=======");//"add" proxy.edit(); }

3.cjlib动态代理

//重点在于理解他的单测内容public class UserService { public void delete(){ System.out.println("delete ok!"); }} @Test /** * cglib动态代理测试 */ public void cglibProxyTest(){ final UserService service=new UserService(); //cglib动态代理 //01.需要类 Enhancer Enhancer enhancer=new Enhancer();//导入spring-core4.2.3.RELEASE enhancer.setSuperclass(service.getClass()); enhancer.setCallback(new org.springframework.cglib.proxy.MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("before"); method.invoke(service, objects); System.out.println("after"); return null; } }); //02.用方法 UserService proxy= (UserService)enhancer.create(); //03. proxy.delete(); } /* CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少, 但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象, 因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。
    同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。*/


原创粉丝点击