最近在研究SpringAOP,当然要学习AOP就要知道这么健硕、强大的功能的背后究竟隐藏着怎样不可告人的“秘密??

接下来就是查阅了许多资料详细的研究了一下Java的代理模式,感觉还是非常非常重要的,

我们作为一个有“内涵的”程序员就更应该掌握啦!(本文需要细心、带有审视的目光来甄别其中的内容)


在学习代理模式的时候我首先要提出几个问题,

  1、什么是代理模式?

    举个例子吧:我们生活中的租房问题。假如我们去租个房子,我们大多数情况下是不会知道房主(就是真正租房,一手货源)的,我们是不是都是先去某些租房平台,或者去找当地的中介去询问何时的房子。我们通过九牛二虎之力在中介那里找到了个物美价廉的房子后,你的租金是不是交给了中介,中介还会收取一些额外的推荐费啦,押金啦、手续费等之类的,那么好,这样的一小段,就已经出来了其中两大核心对象了。

    房主(把房子交给中介的人):被代理对象

    中介(租给你房子的人):代理对象

  2、代理模式有哪些作用? 

    1.可以隐藏目标的的具体实现(还是拿上面租房的例子来说,房主把房子交给了中介,并和中介谈好了价格我 7你3啊。然后当我们去租房子的时候,是中介正面把房子租给了我们,而真正背后卖房子的并未出面,这样就隐藏了背后人的信息和提高了背后人的安全)

    2.可以在不修改目标类代码的情况下,对其增加新的功能。(上面例子来说:房东把房子交给中介的时候价格可能只有1000,但是房东可以卖到5000,然后卖出去后在把1000给房东,自己收入4000,这样原房东不但收到了应由的钱,中介还收入了更多的额外费用)。

  3、代理模式有哪几种?分别都有什么不同?

    在我们Java程序中代理模式分为:静态代理和动态代理(动态代理又分为:JDK动态代理和CGLIB动态代理)

    至于什么不同,接下来正式我们着重要学习的内容

 


 

静态代理

什么是静态代理呢?

  • 顾名思义,就是静态的,死的,一旦创建了就不允许修改了或者说很难修改(指的是程序运行期间)
  • 专业一些的解释
    • 如若代理类在程序运行之前就已经存在,那么这种代理方式被称为静态代理。这种情况下的代理类通常都是我们在Java代码中定义的。
    • 通常情况下静态代理类和目标类通常都会实现同一个接口或者派生自同一父类  

具体实现:

被代理类与代理类共同实现的接口

复制代码
package cn.arebirth.staticproxy;  /**  * 需要实现的共同接口
* 因为要保证代理类要不改变被代理类原来功能的基础上增加新的功能
*/public interface RentalHouse { /** * 出租房子 */ void rent(); }
复制代码

被代理类(房东)

复制代码
package cn.arebirth.staticproxy;  /**  * 房东(目标类、被代理类)  */public class Host implements RentalHouse {      @Override     public void rent() {         System.out.println("我是房东,出租500平米的大房子");     } }
复制代码

代理类(中介)

复制代码
package cn.arebirth.staticproxy;  /**  * 静态代理类(中介、代理类)  * 注意:需要被代理类实现相同的接口  */public class StaticProxy implements RentalHouse {     private RentalHouse rentalHouse;      public