文档章节

代理模式、动态代理模式及spring aop

 大胖和二胖
发布于 2016/07/07 10:59
字数 573
阅读 35
收藏 0

首先是代理模式,简单解释如下,大家都是程序员,有的是实际干活的,有的是manager,老板把活发下来了,mananer再交给下面的兄弟去干。

public interface Coder(){

    public void writeCode();

}

public class RealCoder() implements Coder{

    public void writeCode(){

        //codeing~~~~

    }

}

public class Manager implements Coder{

    private Coder coder;

    public Manager(Coder coder){

        this.coder = coder;

    }

 

    public void writeCode(){

        //需求分析、任务分解、安排计划

        this.coder.writeCode();

        //质量控制、安排测试、提交成果物

    }

}

上面的代理模式,我们称之为静态代理模式,manager的活具体交给谁干,预先设定好的。

那么另外一种模式,动态代理,具有更强的灵活性,因为它不用在我们设计实现的时候就指定某一个代理类来代理哪一个被代理对象,我们可以把这种指定延迟到程序运行时由JVM来实现。在下面这段代码当中manager实现了 InvocationHandler,而在manager当中并没有直接指定它需要哪一类coder来替他完成工作。这个指定,是在运行时,通过java proxy来完成的。这样具备了极大地灵活性。

import java.lang.reflect.InvocationHandler;  
import java.lang.reflect.Method;  
import java.lang.reflect.Proxy;  
 
//Coder interface
interface Coder {  
    public void writeCode();  
}  
 

class RealCoder implements Coder {  
    public void writeCode() {  
        System.out.println("Coding~~~ Coding~~~ Coding~~~");
    }  
}  
 
// manager DynamicProxy
class Manager implements InvocationHandler {  
 
    Object obj = null;  
 
    public Manager(Object obj) {  
        this.obj = obj;  
    }  
 

    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        /*  
         * before :spring aop works here;  
         */
        Object result = method.invoke(this.obj, args);  
          
        /*  
         * after : spring aop works here;  
         */
        return result;  
    }  
}  
 
// 测试类  
public class Boss {  
    public static void main(String[] args) {  
 
        Coder realCoder = new RealCoder();  
 
        ClassLoader loader = realCoder.getClass().getClassLoader();  
 
        Class<?>[] interfaces = realCoder.getClass().getInterfaces();  
 
        InvocationHandler manager = new Manager(realCoder);  
 
        Coder coder = (Coder) Proxy.newProxyInstance(  
                loader, interfaces, manager);  
 
        coder.writeCode();  
        System.out.println(coder.getClass().getName());  
    }  
}

动态代理看起来是个很不错的东西,那么具体在哪里用到了呢?

我们回忆一下spring的aop是如何配置和实用的。

1、首先我们要写一系列的class,分别实现interceptor接口。

2、然后把这些个class,写到spring配置文件当中去。

3、把这一系列的bean id,写到spring的aop列表当中去。

注意上面的manager类的invoke方法,在具体业务执行的前后,我们是可以添加类似于非业务性的代码。这里也就是实际上我们在spring aop当中,实现一些非业务性需求的地方。

© 著作权归作者所有

粉丝 23
博文 69
码字总数 50842
作品 0
沈阳
架构师
私信 提问
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
2018/10/10
0
0
这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行...

Java填坑之路
2018/08/17
0
0
面试官:Spring中用了哪些设计模式?

前言 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪...

Java填坑路
02/15
563
0
大家自己手写设计模式吗?

希望如实回答,想评论 不会设计模式的都是屌丝的,不会设计模式都是码农的都别评论了。我接受不了。 自负,自傲的前辈也别评论了。我只是想知道,设计模式在工作中用的多不多。单例之类除外。...

韭零后张子游
2013/07/19
2.2K
33
Spring中用了哪些设计模式?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内...

HOT_POT
02/17
88
0

没有更多内容

加载失败,请刷新页面

加载更多

采坑指南——k8s域名解析coredns问题排查过程

正文 前几天,在ucloud上搭建的k8s集群(搭建教程后续会发出)。今天发现域名解析不了。 组件版本:k8s 1.15.0,coredns:1.3.1 过程是这样的: 首先用以下yaml文件创建了一个nginx服务 apiV...

码农实战
23分钟前
3
0
【2019年8月版本】OCP 071认证考试最新版本的考试原题-第6题

choose three Which three statements are true about indexes and their administration in an Orade database? A) An INVISIBLE index is not maintained when Data Manipulation Language......

oschina_5359
25分钟前
4
0
阿里巴巴开源 Dragonwell JDK 最新版本 8.1.1-GA 发布

导读:新版本主要有三大变化:同步了 OpenJDK 上游社区 jdk8u222-ga 的最新更新;带来了正式的 feature:G1ElasticHeap;发布了用户期待的 Windows 实验版本 Experimental Windows version。...

阿里巴巴云原生
31分钟前
3
0
教你玩转Linux—磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题,Linux磁盘管理常用三个命令为df、du和fdisk。 df df命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少...

xiangyunyan
34分钟前
6
0
js 让textarea的高度自适应父元素的高度

textarea按照普通元素设置height是没有作用的,可以这么来设置, 下面给上一段项目代码 JS代码: $.fn.extend({ txtaAutoHeight: function () { return this.each(function () {...

文文1
34分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部