• 基于jdk proxy的动态代理模式


    代理模式 是spring AOP机制的实现基础,有必要学习一下。

    有两种,一种是目标类有接口的, 采用JDK动态代理,一种是目标类没接口的,采用CGLIB动态代理。

    先看一组代码,

    package com.sinosoft.proxy;
    
    public interface UserInterface {
        
        public abstract void add();
        public abstract void delete();
    
    }
    
    
    package com.sinosoft.proxy;
    
    public class UserInterfaceImpl implements UserInterface{
    
        @Override
        public void add() {
            System.out.println("add add add");
            
        }
    
        @Override
        public void delete() {
            // TODO Auto-generated method stub
            System.out.println("delete delete delete");
        }
        
    
    }

    输出结果如下,

    现在,我们提出需求,我们希望用户在每个操作的时候都记录日志
    该怎么做?
    我们这时就可以使用 动态代理机制 , 通过动态代理 Factory ( 相当于 Spring 容器 ) 来生成代理实例 。
    由代理对象来完成该功能。

    第一,JDK动态代理方式

    package com.sinosoft.proxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class ProxyFactory implements InvocationHandler{
        private Object target;
        
        private ProxyFactory(){}
        
        public static ProxyFactory getInstance(){
            
            //Runtime
            return new ProxyFactory();
        }
        
        public Object getProxy(Class clazz){
            Object proxy=Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
            return proxy;
                
        }
    
        @Override
        public Object invoke(Object object, Method method, Object[] params)
                throws Throwable {
            // TODO Auto-generated method stub
            Object retVal=null;
            try {
                System.out.println("before....");
                retVal=method.invoke(target, params);
                System.out.println("ater.....");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                System.out.println("exception.....");
            }finally{    
                System.out.println("finally....");
            }
            return retVal;
        }
    }
    
    
    package com.sinosoft.proxy;
    
    import org.junit.Test;
    
    public class ProxyTest {
        @Test
        
        //public static void main(String[] args) {
        public void test1(){
            
            UserInterfaceImpl userimpl=new UserInterfaceImpl();
            userimpl.add();
            userimpl.delete();
        }
            
        //}
        
        @Test
        public void test2(){
            ProxyFactory factory=ProxyFactory.getInstance();
            
            UserInterface userinterface=(UserInterface)factory.getProxy(new UserInterfaceImpl().getClass());
            
            System.out.println(userinterface.getClass());
            userinterface.add();
            userinterface.delete();
            
        }
    
    }
  • 相关阅读:
    java处理图片--图片的缩放,旋转和马赛克化
    Node.JS + MongoDB技术浅谈
    nodejs版本更新问题:express不是内部或外部命令
    解决mongodb的安装mongod命令不是内部或外部命令
    MongoDB Windows环境安装及配置
    WebStorm主题设置
    分页插件PageHelper
    Dubbo入门
    JVM组成
    java 多线程例子
  • 原文地址:https://www.cnblogs.com/vinplezhang/p/3660602.html
Copyright © 2020-2023  润新知