通俗易懂式分析静态代理模式_ _扎根spring AOP必须要掌握的代理模式之静态代理

Posted 小姜姜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通俗易懂式分析静态代理模式_ _扎根spring AOP必须要掌握的代理模式之静态代理相关的知识,希望对你有一定的参考价值。

有的不太清楚Spring AOP以及静态代理,下面是两者的一个简单介绍

Spring AOP 简介

如果说 IoC 是 Spring 的核心,那么面向切面编程就是 Spring 最为重要的功能之一了,在数据库事务中切面编程被广泛使用。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

静态代理简介

 

由开发者或者工具类生成代理类的源码,再编译代理类。所谓的静态代理就是在程序运行之前就已经存在代理类的字节码文件,代理类和委托类在程序运行前就已经确定了关系。


 

下面我将为大家推荐一套相关教程,此教程为B站极力推荐的一套视频教程,视频教程深入浅出讲解Spring的核心技术IoC、AOP,剖析框架的源代码。能让大家掌握框架的原理和应用。

在线观看视频链接:https://www.bilibili.com/video/BV1Ug4y1i7W7

视频教程及资料源码下载链接:http://www.bjpowernode.com/javavideo/125.html

代理模式定义

首先我们来看看代理模式:

 

所谓代理模式,是指客户端(Client)并不直接调用实际的对象(下图右下角的RealSubject),而是通过调用代理(ProxySubject),来间接的调用实际的对象。

 

代理模式的使用场合,一般是由于客户端不想直接访问实际对象,或者访问实际的对象存在技术上的障碍,因而通过代理对象作为桥梁,来完成间接访问。

业务场景

首先有个UserService接口,接口里有一个添加用户的方法

 

这是它的实现类

 

 

 

 现在需要在添加用户的时候记录一下日志。当然,你可以直接在addUser里面直接写添加日志的代码,

 

但是Java推崇单一职责原则,如果这样写就违背了这个原则,我们需要将添加日志的代码解耦出来,让addUser()方法专注写自己的业务逻辑。

静态代理

根据类图,创建一个静态代理类

 

 

我们建立一个测试类来测试静态代理:

 

 

运行结果:

 

 

 

如此,一个静态代理类就创建好了,我们可以专注在Service写业务逻辑,添加日志等非业务逻辑交给这个静态代理类来完成。

静态代理的缺点

缺点一:接口增加方法,代理类需要同步维护

随着业务扩大,UserService类里不知有addUser方法,还有updateUser、deleteUser、batchUpdateUser、batchDeleteUser等方法,这些方法都需要记录日志。

UserServiceImpl类如下:

 

那么对应的静态代理类如下:

 

从上面我们可以看到,代理类里有很多重复的日志代码。因为代理类和目标对象实现同一个接口,一旦接口增加方法,代理类也得同步增加方法并且得同步增加重复的额外功能代码,增大了代码量

缺点二:接口越多,导致代理类繁多

如果需要增加业务类,如StudentService,TeacherService等等,这些类里的方法也都需要实现增加日志的方法,那么就需要同步创建对应的代理类。此外静态代理类不是自动生成的,需要在编译之前就编写好的,如果业务越来越庞大,那么创建的代理类越来越多,这样又增大了代码量

如何解决这些缺点呢?这时候就需要动态代理方法了,下回我们就来讲讲动态代理,分别为crlib动态代理和JDK动态代理!!!

快点个爱心收藏起来吧!!!

 

 

声明:文章非原创

转载自:csdn作者Java叶知秋

 

以上是关于通俗易懂式分析静态代理模式_ _扎根spring AOP必须要掌握的代理模式之静态代理的主要内容,如果未能解决你的问题,请参考以下文章

对Spring中的IOC与AOP简单理解(简单的理解,通俗易懂)

Spring_代理

设计模式之单例模式(通俗易懂,超详细)

控制反转和依赖注入的理解(通俗易懂)

响应式编程入门指南 - 通俗易懂 RxJS

详细的css3中的弹性布局介绍_通俗易懂