zoukankan      html  css  js  c++  java
  • Spring代理模式

    二者区别:

    静态代理模式:
    灵活性不强;如果有1000个dao;就有1000个代理类;没有做到通用性

    静态代理模式:

    package StaticProxy;
    
    public interface PersonDao {
        
        public void sava();
        
        public void update();
    
    }
    package StaticProxy;
    
    public class PersonDaoimpl implements PersonDao {
    
        public String user = null;
        PersonDaoimpl(){}
        /**
         * @return the user
         */
        public String getUser() {
            return user;
        }
    
        /**
         * @param user the user to set
         */
        public void setUser(String user) {
            this.user = user;
        }
        
        PersonDaoimpl(String user){
            this.user = user;
        }
        
        @Override
        public void sava() {
            // TODO Auto-generated method stub
            System.out.println("进入方法");
        }
    
        @Override
        public void update() {
            // TODO Auto-generated method stub
            
        }
    
    }
    package StaticProxy;
    import JDKProxy.impl.PersonDaoImpl;
    
    //静态代理类
    
    public class personproxy implements PersonDao{
    
        public PersonDaoimpl persondaoimpl;
        
        public personproxy(PersonDaoimpl persondaoimpl){
            this.persondaoimpl = persondaoimpl;
        }
        
        @Override
        public void sava() {
            // TODO Auto-generated method stub
            if(persondaoimpl.getUser() != null){
                persondaoimpl.sava();
            }
        }
    
        @Override
        public void update() {
            // TODO Auto-generated method stub
            
        }
        
    }

    测试类:

    package StaticProxy;
    
    public class Test {
        
        public static void main(String[] args) {
            //创建代理类
            personproxy pro  = new personproxy(new PersonDaoimpl());
            pro.sava();
        }
    
    }

    动态代理模式:
    JDK : proxy
    要求:目标类要有实现接口

    package JDKProxy;
    //接口
    public interface PersonDao {
        
        public void sava(String name);
        public void update(String name);
        public String getUsername(String name);
    
    }
    package JDKProxy.impl;
    
    import JDKProxy.PersonDao;
    
    public class PersonDaoImpl implements PersonDao {
    
        private String user = null;
        
        /**
         * @return the user
         */
        public String getUser() {
            return user;
        }
    
        /**
         * @param user the user to set
         */
        public void setUser(String user) {
            this.user = user;
        }
    
        public PersonDaoImpl(){}
        
        public PersonDaoImpl(String user){
            this.user = user;
        }
        
        @Override
        public String getUsername(String name) {
        
            System.out.println("这是getusername()方法");
            
            return "oooo";
        }
    
        @Override
        public void sava(String name) {
            
            System.out.println("这是save()方法");
            
        }
    
        @Override
        public void update(String name) {
            
            System.out.println("这是update()方法");
            
        }
    
    }
    package JDKProxy;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import JDKProxy.impl.PersonDaoImpl;
    
    /**
     * 代理工厂
     * 
     * @author Administrator
     * 
     */
    public class JdkProxyFactory implements InvocationHandler {
    
        private Object targetObject;
    
        /**
         * 生成代理对象
         * 
         * @param targetObject
         * @return
         */
        public Object createProxyObject(Object targetObject) {
            this.targetObject = targetObject;
            // 生成代理对象
            // loader:目标类的加载器
            // interfaces:目标类的所有接口
            // 回调接口类
            return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                    targetObject.getClass().getInterfaces(), this);
        }
    
        /**
         * 代理类回调方法 在调用目标类方法的时候进行回调
         * 调用目标类方法时进行拦截
         */
        @Override//环绕通知
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
    
            PersonDaoImpl persondaoimpl = (PersonDaoImpl) this.targetObject;
    
            Object invoke = null;
            
            try {
    package JDKProxy;
    
    import JDKProxy.impl.PersonDaoImpl;
    
    public class JdkProxyTest {
        public static void main(String[] args) {
            //创建动态代理工厂
            JdkProxyFactory jdkproxy = new JdkProxyFactory();
            //为目标类创建代理对象
            PersonDao persondao = (PersonDao) jdkproxy
                    .createProxyObject(new PersonDaoImpl(""));
            persondao.update("xxx");
        }
    }
    
    
    
    //....begin():前置通知
                if (persondaoimpl.getUser() != null) {
                    // 委派目标对象调用方法:调用的目标方法称为连接点
                    invoke = method.invoke(targetObject, args);
                }
                //.....commit():后置通知
                
            } catch (Exception e) {
                //callback():异常通知
            }finally{
                //close():最终通知
            }
            
            return invoke;
        }
    
    }

    测试:

  • 相关阅读:
    BZOJ1527 : [POI2005]Pun-point
    2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    NAIPC-2016
    BZOJ2498 : Xavier is Learning to Count
    ACM ICPC Vietnam National Second Round
    XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
    XVI Open Cup named after E.V. Pankratiev. GP of Peterhof
    HDU5509 : Pattern String
    BZOJ4583 : 购物
  • 原文地址:https://www.cnblogs.com/cw172/p/11756583.html
Copyright © 2011-2022 走看看