zoukankan      html  css  js  c++  java
  • Spring学习之设计模式,动态代理和gclib动态代理

    传统的代理模式是静态代理,也就是在方法区域中写入方法。

    而动态代理的作用是,不修改实现类的代码,能够在代码的前后或者抛出异常的前后执行某个方法。

    动态代理类的实现

    //Interface
    public interface UserServiceInter {
        void save();
        void delete();
        void modify();
        void search();
    }
    //entity
    public class UserService implements UserServiceInter{
        public void save(){
            System.out.println("保存");
        }
        
        public void delete(){
            System.out.println("删除");
        }
        
        public void modify(){
            System.out.println("修改");
        }
        
        public void search(){
            System.out.println("查询");
        }
    }
    //代理类以及测试类
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class UserServiceProxyFactory implements InvocationHandler{
        private UserService us;
        
        public UserServiceProxyFactory(UserService us) {
            this.us = us;
        }
    
        public UserServiceInter getUserServiceProxy(){
            UserServiceInter us=(UserServiceInter) Proxy.newProxyInstance(UserService.class.getClassLoader(), 
                    UserService.class.getInterfaces() , this);
            return us;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before invoke");
            Object invoke=method.invoke(us, args);
            System.out.println("after invoke");
            return invoke;
        }
        
        public static void main(String[] args) {
            UserServiceProxyFactory factory=new UserServiceProxyFactory(new UserService());
            UserServiceInter us=factory.getUserServiceProxy();
            us.delete();
        }
    }

    运行结果:

    注意:Proxy.newInsatance()的三个参数,第一个是实现类或者Interface的类加载器,第二个是实现类的Interface数组,第三个是Invocation接口的实现类

    接收使用实现类的Interface接口进行接收。

    CGlib动态代理

    import java.lang.reflect.Method;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    //spring整合了cglib的Enhancer类,cglib代理实质是一个继承代理
    public class UserServiceProxyFactory2 implements MethodInterceptor{
        public UserServiceInter getUserServiceProxy(){
            Enhancer en=new Enhancer();//该类帮我们生成代理对象
            en.setSuperclass(UserService.class);//代理类
            en.setCallback(this);//代理做什么
            UserServiceInter us=(UserServiceInter) en.create();//创建代理对象
            return us;
        }
    
        @Override
        public Object intercept(Object proxyobj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
            System.out.println("before");
            //调用原有方法
            Object ret=methodProxy.invokeSuper(proxyobj, arg);
            System.out.println("after");
            return ret;
        }
        public static void main(String[] args) {
            UserServiceInter us=new UserServiceProxyFactory2().getUserServiceProxy();
            us.delete();
        }
    }
  • 相关阅读:
    HDU 1202 The calculation of GPA
    HDU 1201 18岁生日
    HDU 1200 To and Pro
    C语言实现的图的深度搜索与广度搜索程序
    深度优先搜索和广度优先搜索的深入讨论
    Linux sftp 安全文件传输命令
    看白鹿原有感
    中国人民抗日战争暨世界反法西斯战争胜利70周年(20150903)
    高一的我曾对自己说"要放慢脚步去生活"!?
    网络营销(续)
  • 原文地址:https://www.cnblogs.com/littlepage/p/10877574.html
Copyright © 2011-2022 走看看