spring aop设计模式_Spring框架中设计模式的运用

6ba5d3c67c979e0441968c07f8f919e7.gif

        设计模式大家可能随口就能说出总共有23种,但是具体怎么用,或者在常用的组建中有哪些体现,这时候不一定说的上来了。接下来几篇文章,我们一起深入理解。首先我们一起了解下常用的组建中是怎么运用的,比如 JDK、Sring、Mybatis。

         Java 开发人员想必非常熟悉Spring 框架--为我们节省很多基础的工作,是效率提升的利器。在开发之前呢,首先需要做的是系统设计或者说功能设计,这时候会遇到怎么实现的问题,我们一起参考下spring 这款优秀的框架。

3e73f6cb84d5fa73a86b34d618fadb45.png回顾下Spring框架的核心模块划分:

Core Container(核心容器)

  • Beans:负责Bean工厂中Bean的装配,所谓Bean工厂即是创建

    对象的工厂,Bean的装配也就是对象的创建工作;

  • Core:这个模块即是负责IOC(控制反转)最基本的实现;

  • Context:Spring的IOC容器,因大量调用Spring Core中的函数,

    整合了Spring的大部分功能。Bean创建好对象后,由Context负责建立Bean与Bean之间的关系并维护。所以也可以把Context看成是Bean关系的集合;

  • SpEl:即Spring Expression Language(Spring表达式语言);

Data Access/Integration(数据访问/集成):

  • JDBC:对JDBC的简单封装;

  • ORM:支持数据集成框架的封装(如Mybatis,Hibernate);

  • OXM:即Object XML Mapper,它的作用是在Java对象和XML

    文档之间来回转换;

  • JMS:生产者和消费者的消息功能的实现;

  • Transations:事务管理,不多BB;

Web:

  • WebSocket:提供Socket通信,web端的的推送功能;

  • Servlet:Spring MVC框架的实现;

  • Web:包含web应用开发用到Spring框架时所需的核心类,包括

    自动载入WebApplicationContext特性的类,Struts集成类、文件上传的支持类、Filter类和大量辅助工具类;

  • Portlet:实现web模块功能的聚合(如网站首页(Port)下面可

    能会有不同的子窗口(Portlet));

AOP:

  • 面向切面;

Aspects:

  • 同样是面向切面的一个重要的组成部分,提供对AspectJ框架的

    整合; 

Instrumentation(设备):

  • 相当于一个检测器,提供对JVM以及对Tomcat的检测;

Messaging(消息):

  • Spring提供的对消息处理的功能;

接下来我们进入正题--设计模式在Spring框架中的使用

01

d5f27edfb20297a7dfd125d31904946b.gif

简单工厂

        又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

        简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

        Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。

02

d5f27edfb20297a7dfd125d31904946b.gif

工厂方法(Factory Method)

定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

Spring中的FactoryBean就是典型的工厂方法模式。如下图:

e93d8fdcbd55786faebec8672fc32631.png

03

d5f27edfb20297a7dfd125d31904946b.gif

单例(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

Spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为Spring管理的是是任意的Java对象。

04

d5f27edfb20297a7dfd125d31904946b.gif

适配器(Adapter)

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

Spring中在对于AOP的处理中有Adapter模式的例子,见如下图:2705ee8a73bddc7bb5bcca7c2bd04fe3.png

由于Advisor链需要的是MethodInterceptor(拦截器)对象,所以每一个Advisor中的Advice都要适配成对应的MethodInterceptor对象。

05

d5f27edfb20297a7dfd125d31904946b.gif

包装器(Decorator)

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

798afb45ff3cdb7cbcf0d74701de8422.png

Spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。

06

d5f27edfb20297a7dfd125d31904946b.gif

代理(Proxy)

为其他对象提供一种代理以控制对这个对象的访问。

从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。

8e3da581ab6b251ec0a4caa704b77911.png

Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

07

d5f27edfb20297a7dfd125d31904946b.gif

观察者(Observer)

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2d5e2cd8fdcbf5de382af4e30b383e6a.png

Spring中Observer模式常用的地方是listener的实现。如ApplicationListener。

08

d5f27edfb20297a7dfd125d31904946b.gif

策略(Strategy)

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

Spring中在实例化对象的时候用到Strategy模式,见如下图:78c3e9bb4675cb04509d163f9e415c67.png

在SimpleInstantiationStrategy中有如下代码说明了策略模式的使用情况:

d93750c5b26233600ae0dfb11c27ffa7.png

09

d5f27edfb20297a7dfd125d31904946b.gif

模板方法(Template Method)

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。Spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。

以下是一个具体的例子:

JdbcTemplate中的execute方法:

7e6b87f96fd2e560936868a617a942f2.png

JdbcTemplate执行execute方法:

d27ede47cc4adf14ef3daec59148d1af.png

        本文我们一起了解了在Spring中使用的到的设计模式,下一篇我们一起看看在JDK中设计模式的运用。

b4c76b7768a14fa2d74b94e709afd2a5.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用yum命令安装mysql_Linux Centos 下使用yum 命令安装mysql实现步骤

linux centos 下使用yum 命令安装mysql实现步骤1. 查看服务器中有没有安装过mysql1. 查看有没有安装包:yum list mysql*#移除已经安装的mysqlyum remove mysql mysql-server mysql-libs compat-mysql51rm -rf /var/lib/mysqlrm /etc/my.cnf2. 查看是否还有mysql软件:rpm -qa|gr…

sql unicode转中文_SELECT语句《SQL必知必会》

数据库中有哪些数据类型?数据库中最常用对数据类型有三种:Text(文本)、Number(数字)和 Date/Time。文本类型:即字符串,如“nameasdas”数字类型:十进制数字,如…

mpython 直接访问_如何从python代码中直接访问Android的Service

在Kivy中,通过pyjnius扩展可以间接调用Java代码,而pyjnius利用的是Java的反射机制。但是在Python对象和Java对象中转来转去总让人感觉到十分别扭。好在android提供了binder这个进程间通信的功能,Java中的Service也是基于Binder的C代码封装来实…

python中attr_python中hasattr()、getattr()、setattr()函数的使用

引言:在阅读高手写的代码时,有很多简写的形式,如果没有见过还真的看不太懂是什么意思,其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法,相关联的hasattr()、getattr()、setattr()函数的使用也一并学习…

python前n项和存为一个数组_在Python中存储多个数组

我正在编写一个程序来模拟像Gallup或Rasmussen这样的公司每天发布的实际投票数据:www.gallup.com和www.rassmussenreports.com我正在使用强力方法,计算机生成一些随机的每日轮询数据,然后计算三天平均值,以查看随机数据的平均值是否与民意测验数字相匹配. (大多数公…

织梦数据库改mysql前缀_织梦快速批量修改MYSQL数据库表前缀与表名实例操作

这篇文章主要为大家详细介绍了织梦快速批量修改MYSQL数据库表前缀与表名实例操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。我们在安装织梦系统的时候,有一次批量修改mysql数据库表前缀的机会&am…

python实时绘图暂停_Python实时绘图

我在两个数组中获取了一些数据:一个用于时间,一个用于值.当我达到1000点时,我触发一个信号并绘制这些点(x 时间,y 值).我需要在前面的图中保持相同的数字,但只是一个合理的数字,以避免减慢过程.例如,我想在我的图表上保留10,000点.matplotlib交互式绘图工作正常,但我…

python 读文件写数据库_python读文件写数据库

Python 读文件,写数据库Python 读文件打开文件Python读写文件在计算机语言中被广泛的应用,如果你想了解其应用的程序,以下的文章会给你详细的介绍相关内容,会你在以后的学习的过程中有所帮助,下面我们就详细介绍其应用…

python怎么用gamma函数_如何通俗的理解伽马(gamma)函数

如何通俗的理解伽马(gamma)函数 - 直觉,求导和示例我为什么要在乎garmma分布?使用伽马函数定义了许多概率分布,例如伽马分布,Beta分布,狄利克雷分布,卡方分布和学生t分布等。 对于数据科学家,机…

mysql支持表情输入_让MySQL支持Emoji表情 mysql 5.6

在做微信公众号开发过程中,经常碰到用户的昵称中有表情,在MySQL保存时常用的utf8 字符集根本无法存储表情,提示错误如下:java.sql.SQLException: Incorrect string value: \xF0\x9F\x92\x94 for column nick_name at row 1at com.…

graphpad如何检测方差齐_如何选择方差分析的多重比较方法?资料集锦

欢迎订阅SPSS训练营号方差分析时,如果因素主效应有显著影响,则需要对因素水平进行两两比较,以确认因素水平间的具体差异。这个过程也叫作多重比较。SPSS提供14种用于方差齐次的多重比较方法,还有4种方差不齐情况下的多重比较方法&…

编程真好玩python_(两本套)编程真好玩+教孩子学编程(Python语言版)

第1 章 Python 基础:认识环境 1 11 认识Python 3 12 用Python 编写程序 5 13 运行Python 程序 5 14 本章小结 6 15 编程挑战 7 第2 章 海龟作图:用Python 绘图 9 21 **个海龟程序 10 211 程序是如何工作的 10 212 发生了什么 12 22 旋转的海龟 13 23 海龟…

反转链表 python 递归_LeetCode 206.反转链表(Python3)

题目:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。你能否用两种方法解决这道题?解答:方法一:原地反转。# Definition for singly-…

java image 透明_java的BufferedImage对象透明化背景

近用到Java动态生成背景透明的图片功能,从gif和png中选择了png格式,个中缘由就不说了,于是动手到网上搜索有用的代码。现把搜索结果总结如下:1. 生成png图片int width 400;int height 300;// 创建BufferedImage对象BufferedImag…

【MySQL学习笔记009】事务

一、事务简介 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 二、事务操作 1、操作1 查看/设置事务提交方式 select a…

python的pypi安装_python pip及安装包安装

python 微信聊天D:\untitled\hello.py 入口 web禁止登陆。。安装命令:手动安装:D:\python\setuptools-41.2.0>python setup.py install下载下来手动安装pipD:\python\pip-1.4.1\pip-1.4.1>python setup.py installD:\python\setuptools-41.2.0>…

python 爬取生意参谋数据_如何爬取生意参谋数据?是不是违规操作?

1、在淘宝选项卡中,打开【生意参谋】工具。2、在【生意参谋数据拷贝】中,点击【打开生意参谋】按钮。3、在调用的IE浏览器中输入账号和密码。4、登陆好后,找到竞品,并点击【查看详情】。5、进入到竞品详情后,注意修改日…

c mysql 视图_MySQL入门教程(七)之视图

相关阅读:视图是从一个或多个表中导出来的虚拟表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。1、视图简介1.1 视图的含义视图是从一个或多个表中导出来的虚拟表,还可以从已经存在的视图的基础上定义。数据库中只存放视图的定…

tensorflow gpu安装_tensorflow-gpu安装配置

1 介绍目前,主流版本是tensorflow-gpu 1.12.0,线上安装这个版本,和这个版本搭配的cuda是9.0版本,cudnn版本是7.0.5。2 cuda和cudnn安装cuda驱动地址:cuda_9.0.176_384.81_linux.runcudnn库地址: cudnn-9.0-linux-x64-v…

hibernate mysql autocommit_Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?...

求大神讲解下Hibernate4 中为什么我没有用commit()方法直接用save就存到数据库了?public class Main {public static void main(String[] args) {SessionFactory sessionFactory new Configuration().configure().buildSessionFactory();Student student new Stud…