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

    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 {
                //....begin():前置通知
                if (persondaoimpl.getUser() != null) {
                    // 委派目标对象调用方法:调用的目标方法称为连接点
                    invoke = method.invoke(targetObject, args);
                }
                //.....commit():后置通知
                
            } catch (Exception e) {
                //callback():异常通知
            }finally{
                //close():最终通知
            }
            
            return invoke;
        }
    
    }

    测试:

    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");
        }
    }

    效果图;

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 
    
    如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦   
    
    如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: 2276292708@qq.com
    
    如果需要转载,请注明出处,谢谢!!
    

      

  • 相关阅读:
    openstack-1基础环境准备
    ELK补充之Filebeat
    ELK补充之logstash
    ELK
    dubbo
    zokeeper+kafka
    rabbitmq
    jenkins补充-编写自动化脚本实现devops 流水线和回滚等操作
    sonar
    python连接数据库之(连接MySQL)
  • 原文地址:https://www.cnblogs.com/wlx520/p/4740033.html
Copyright © 2011-2022 走看看