静态代理和动态代理的区别和理解

版权声明:RemainderTime https://blog.csdn.net/qq_39818325/article/details/86569016

            静态代理

                     概念:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。

                     优点:代理使客户端不需要知道实现类是什么,怎么做的,而客户端只需知道代理即可(解耦合)

                     缺点:      

                            1)代理类和委托类实现了相同的接口,代理类通过委托类实现了相同的方法。这样就出现了大量的代码重复。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

                            2)代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。

                   说明:代理可以对实现类进行统一的管理,如在调用具体实现类之前,需要打印日志等信息,这样我们只需要添加一个代理类,在代理类中添加打印日志的功能,然后调用实现类,这样就避免了修改具体实现类。满足我们所说的开闭原则。但是如果想让每个实现类都添加打印日志的功能的话,就需要添加多个代理类,以及代理类中各个方法都需要添加打印日志功能(如上的代理方法中删除,修改,以及查询都需要添加上打印日志的功能)

                          即静态代理类只能为特定的接口(Service)服务。如想要为多个接口服务则需要建立很多个代理类。

           动态代理

                         概念:在程序运行时运用反射机制动态创建而成。

                         优点:动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler.invoke)。这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使我们的类职责更加单一,复用性更强。

                        

 代理的通俗理解:其实所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用。

案例说明:代理对象就是把被代理对象包装一层,在其内部做一些额外的工作,比如用户需要上facebook,而普通网络无法直接访问,网络代理帮助用户先FQ,然后再访问facebook。这就是代理的作用了。

总结:

纵观静态代理与动态代理,它们都能实现相同的功能,而我们看从静态代理到动态代理的这个过程,我们会发现其实动态代理只是对类做了进一步抽象封装,使其复用性易用性得到进一步提升而这不仅仅符合了面向对象的设计理念,其中还有AOP的身影,这也提供给我们对类抽象的一种参考。关于动态代理与AOP的关系,个人觉得AOP是一种思想,而动态代理是一种AOP思想的实现!

               

                                                                                       注:部分参考文档:https://www.cnblogs.com/baizhanshi/p/6611164.html

笔记:创建Bean的方式

BeanFactory与FactoryBean的区别

1,BeanFactory接口,顶层父工厂,容器,获取bean的实例

2,FactoryBean 接口,实例化不能通过默认无参构造方法获取的bean通过子类的getObject方法来返回实例,如SessionFactory

如果一个类没有构造方法,但是可以用其它方式拿到它的对象,就可以用FactoryBean

多用于Spring的框架集成

猜你喜欢

转载自blog.csdn.net/qq_39818325/article/details/86569016
今日推荐