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,一经查实,立即删除!

相关文章

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

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

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

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

【MySQL学习笔记009】事务

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

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…

java ee文件下载_JavaEE实现文件下载

我们先来看一个最简单的文件下载的例子:package com.yyz.response;import java.io.FileInputStream;import java.io.IOException;import java.io.OutputStream;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.…

java安全框架有哪些_Java开发必备教程-细说Spring Security安全框架

一、Spring Security介绍spring security 是基于 spring 的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。在 Spring Framework 基础上,spring security 充分利用了依赖注入(DI)和面向切面编程(AOP)功能&…

无法读取源文件或磁盘_raid磁盘阵列作用

磁盘阵列的作用:1.提高传输速率。RAID通过在多个磁盘上同时存储和读取数据来大幅提高存储系统的数据吞吐量(Throughput)。在RAID中,可以让很多磁盘驱动器同时传输数据,而这些磁盘驱动器在逻辑上又是一个磁盘驱动器,所以使用RAID可…

java none怎么用tomcat_JavaWeb学习——在Eclipse里使用Tomcat

JavaWeb学习——在Eclipse里使用Tomcat摘要:本文主要学习了如何在Eclipse里使用Tomcat服务器。添加Tomcat打开Eclipse的配置页面,点击菜单上的“Window”,在下拉菜单中找到“Preferences”:找到运行环境的配置页面,如果…

mysql b 树原因_复习系列之数据库(四):MySQL为什么采用B+树作为索引结构?

MySQL中数据是索引组织表,即表中数据按照主键顺序存放。所以就可以基于索引这种数据结构实现一些高级算法,来提高检索效率。常见的查找算法顺序查找:复杂度O(n),在数据量大时,效率很低二分查找:在有序为前提…

windows无法检索有关这台计算机上的磁盘信息_磁盘镜像软件OO DiskImage Pro 15.5介绍及安装教程...

Active Disk Image是一种磁盘映像软件,可以精确复制任何PC磁盘(HDD,SSD,USB,CD,DVD,Blu-ray等)并将其存储在文件夹中。磁盘映像可用于备份,PC升级或磁盘复制。万一计算机出现故障,可…

word手写字体以假乱真_Word小技巧|打印作文草稿纸

前期介绍过一些Word使用中的小技巧,例如WORD快速查找的2个小技巧 https://www.iappi.cn/2019_08/20191147.html,使用Word创建九宫格图像 https://www.iappi.cn/2019_07/20191064.html 等。今天再分享一个打印作文草稿纸的技巧。很多时候需要规范写好作文…

概要设计说明书_没有什么比牙签更好的设计了

牙签是设计公理的典型例子,形式服从功能。它的形式和功能是单一的、紧凑的、轻质的、可生物降解的、可持续的实体。不证自明的:它的形状是设计功能的缩影,同时作为手柄和说明书。它的形状不仅告诉你如何握住和使用它,而且告诉你把…

java项目log4j_java项目测试log4j

一、基础入门1.1 下载安装下载相应的log4j-1.2.15.jar(也可以下载其他的版本)提供一个下载jar包的网站(http://search.maven.org/)新建一个log4j.properties文件:#配置根Loggerlog4j.rootLoggerinfo, RF #info代表的是日志输出的级别log4j.appender.RForg.apache.lo…

webrtc 代码_英特尔开源WebRTC开发套件OWT

为了抢占实时视频的巨大市场,英特尔开源了WebRTC开发套件,并将其命名为Open WebRTC Toolkit (OWT)。由于实时视频编码、转码需要大量的计算资源,Open WebRTC Toolkit将为英特尔带来巨大的潜在商业回报。文 / Ant去年在旧金山举办的2018 Krank…

零基础自学java_零基础学Java——小白的Java之路(4)

方法方法是一段可以重复调用的代码块,这个代码块实现了某个功能,当我们的程序中需要这一个功能的时候,调用这个方法即可,不再需要重复书写这个功能的代码。方法的定义格式public static ( ,... ){方法体;[return 表达值…

异步fifo_跨时钟域同步(异步FIFO)

本文使用 Zhihu On VSCode 创作并发布跨时钟域同步(异步FIFO)之前学习了跨时钟域下的单bit信号同步的方法,这些单bit信号多是作为控制信号或者标志信号来使用,再实际的项目中,处理多bit数据也是十分常见的,…

dumpbin发现没有入口函数_JavaScript基础之入口函数-2020版

JavaScript基础之入口函数-2020版1.入口函数window.onload function(){ 内部放js}这个函数的意思就是说,当我们页面加载完毕之后(就是说等页面的结构 样式 节点等加载完毕),采取执行函数体里面的js部分。也就是说可以使用此方法,就不用考…

农委系统先进集体推荐报告_来自司法行政的他们,荣获上海档案系统表彰!

为表彰先进、弘扬正气,激发全市各级档案部门和广大档案工作者的积极性和创造性,进一步推进上海档案事业创新发展,经各地区、各部门、各单位民主推荐,市人力资源社会保障局和市档案局审核同意,决定授予50家集体“上海市…

java如何获得wlan mac_Android M 如何获取 Wifi MAC地址

今天在撸代码时发现,之前能获取mac地址的方法在nexus 6上返回了“02:00:00:00:00:00”,进入设置查看mac地址,结果不相同,肯定有问题,于是就开始上网查资料一探究竟。原先获取mac地址的代码段:6.0之前获取ma…