这些Spring中的设计模式,你都知道吗?

转载自  这些Spring中的设计模式,你都知道吗?

设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。

Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范。好了,话不多说,开始今天的内容。

spring中常用的设计模式达到九种,我们举例说明:

第一种:简单工厂

又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 
spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean。

<beans>
<bean id="singletonBean" class="com.itxxz.HelloItxxz"><constructor-arg><value>Hello! 这是singletonBean!value></constructor-arg></ bean><bean id="itxxzBean" class="com.itxxz.HelloItxxz"singleton="false"><constructor-arg><value>Hello! 这是itxxzBean! value></constructor-arg>
</bean></beans>

第二种:工厂方法

通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。

一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。

就以工厂方法中的静态方法为例讲解一下:


import java.util.Random;
public class StaticFactoryBean {public static Integer createRandom() {return new Integer(new Random().nextInt());}
}

建一个config.xm配置文件,将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称

<bean id="random"
class="example.chapter3.StaticFactoryBean" factory-method="createRandom" 
//createRandom方法必须是static的,才能找到 scope="prototype"
/>

测试:

public static void main(String[] args) {
//调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例       
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));       
System.out.println("我是IT学习者创建的实例:"+factory.getBean("random").toString());
}

第三种:单例模式(Singleton)

保证一个类仅有一个实例,并提供一个访问它的全局访问点。 
spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。 
核心提示点:Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope=“?”来指定
 

第四种:适配器(Adapter)
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。

Adapter类接口:Target

public interface AdvisorAdapter {boolean supportsAdvice(Advice advice);MethodInterceptor getInterceptor(Advisor advisor);} MethodBeforeAdviceAdapter类,Adapter
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {public boolean supportsAdvice(Advice advice) {return (advice instanceof MethodBeforeAdvice);}public MethodInterceptor getInterceptor(Advisor advisor) {MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();return new MethodBeforeAdviceInterceptor(advice);}}

 

第五种:包装器

在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往在spring和hibernate框架中总是配置一个数据源,因而sessionFactory的dataSource属性总是指向这个数据源并且恒定不变,所有DAO在使用sessionFactory的时候都是通过这个数据源访问数据库。但是现在,由于项目的需要,我们的DAO在访问sessionFactory的时候都不得不在多个数据源中不断切换,问题就出现了:如何让sessionFactory在执行数据持久化的时候,根据客户的需求能够动态切换不同的数据源?我们能不能在spring的框架下通过少量修改得到解决?是否有什么设计模式可以利用呢? 
首先想到在spring的applicationContext中配置所有的dataSource。这些dataSource可能是各种不同类型的,比如不同的数据库:Oracle、SQL Server、MySQL等,也可能是不同的数据源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然后sessionFactory根据客户的每次请求,将dataSource属性设置成不同的数据源,以到达切换数据源的目的。
spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。 
 

第六种:代理(Proxy)
为其他对象提供一种代理以控制对这个对象的访问。  从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。 
spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。 
 

第七种:观察者(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
spring中Observer模式常用的地方是listener的实现。如ApplicationListener。 
 

第八种:策略(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。 
spring中在实例化对象的时候用到Strategy模式
在SimpleInstantiationStrategy中有如下代码说明了策略模式的使用情况: 
 

第九种:模板方法
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式。 

以下是一个具体的例子: 
JdbcTemplate中的execute方法 


 
JdbcTemplate执行execute方法 

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

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

相关文章

第一章初识java

一、程序&#xff1a; 1.通常指完成某些事物的一种既定方式和过程。 2.计算机程序&#xff1a;为了让计算机执行某些操作或解决某个问题而编写的一系列有序指定的集合。 二、java可以做什么&#xff1a; 1.开发桌面应用程序 2.开发网页应用程序 三、技术平台 javaSE javaEE 四、…

如何移植.NET Framework项目至.NET Core?

公司的项目一直采用.NET框架来开发Web项目。目前基础类库均为.NET Framework 4.6.2版本。Caching, Logging&#xff0c;DependencyInjection&#xff0c;Configuration等基础设施相关的依赖库一直和官方保持同步&#xff0c;目前是1.1版本。.NET Core越来越趋于稳定&#xff0c…

历年安徽省二计算机考试题库,2010安徽省计算机等级考试试题 二级ACCESS最新考试试题库...

1、针式打印机术语中&#xff0c;24针是指( D )A、2424点阵 B、信号线插头有24针C、打印头内有2424根针 D、打印头内有24根针2、在下列存储器中&#xff0c;访问速度最快的是( C )A、硬盘存储器 B、软盘存储器C、半导体RAM(内存储器) D、磁带存储器3、在下列存储中&#xff0c;…

2016蓝桥杯省赛---java---A---8(取球博弈)

题目描述 思路分析 dfs 代码实现 package lanqiao;import java.util.Arrays; import java.util.Scanner;public class Main {public static int []n;public static void main(String[] args) {Scanner scanner new Scanner(System.in);nnew int[3];for (int i 0; i < 3…

SparkSQL 内置函数的使用(JAVA与Scala版本)

SparkSQL 内置函数的使用&#xff08;JAVA与Scala版本&#xff09; agg的使用&#xff08;根据时间&#xff0c;去重id相同&#xff0c;统计相同时间内的id个数&#xff09;Scala版本&#xff01; package com.bynear.Scalaimport org.apache.spark.sql.functions._ import org…

分布式统一配置平台-Disconf.Net

为了更好的解决分布式环境下多台服务实例的配置统一管理问题&#xff0c;本文提出了一套完整的分布式配置管理解决方案。结合.net项目具体情况&#xff0c;实现了配置发布的统一化&#xff0c;对配置进行持久化管理并对外提供restful接口&#xff0c;在此基础上&#xff0c;基于…

计算机软件录音注意事项,GOLDWAVE录音软件使用教程

很多朋友都有录音软件&#xff0c;但是软件功能不全&#xff0c;也不是专业的&#xff0c;所以现在我讲一个专业的软件&#xff0c;这个软件都是原创歌手比较常用的软件&#xff0c;现在我们来学习一下。这是该软件的界面&#xff0c;软件的名字叫做GOLDWAVE这款软件的功能很强…

第二章 变量、数据类型和运算符

一、变量&#xff1a; 1.根据数据类型在内存中分配一个合适的空间并给他命名&#xff0c;即“变量名” 2.将数据存储到这个空间中&#xff0c; 3.从空间中取出数据&#xff0c;可以使用变量名来获得。 二、java中的数据类型 数据类型&#xff1a; 1.数值类型 &#xff08;1&…

这些棘手的Java面试题,答案你都知道吗?

转载自 这些棘手的Java面试题&#xff0c;答案你都知道吗&#xff1f; 棘手的Java面试问题是那些有一些惊喜元素的问题。如果你试图用常识回答一个棘手的问题&#xff0c;你很可能会因为需要一些特定的知识而失败。大多数棘手的Java问题来自于令人困惑的概念&#xff0c;如函…

Spark SQL 开窗函数row_number的使用

Spark SQL 开窗函数row_number的使用 窗口函数 row_number即为分组取topN参考文本&#xff1a; 型号 类别 销售量/月小米,手机,250 华为,手机,450 苹果,手机,1000 三星,手机,2500 小米Pro,笔记本,1500 苹果Pro,笔记本,2000 …

2016蓝桥杯省赛---java---A---10(压缩转换)

题目描述 小明最近在研究压缩算法。 他知道&#xff0c;压缩的时候如果能够使得数值很小&#xff0c;就能通过熵编码得到较高的压缩比。 然而&#xff0c;要使数值很小是一个挑战。 最近&#xff0c;小明需要压缩一些正整数的序列&#xff0c;这些序列的特点是&#xff0c;后面…

jquery选择器案例分享

其中选择器都已经注释&#xff0c;需要测试哪个打开注释即可观察效果&#xff01;&#xff01; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script type"text/javascript" src"js/j…

量子计算机对人类长寿,科学家称“极端长寿”在未来几十年可能会达到新的里程碑...

原标题&#xff1a;科学家称“极端长寿”在未来几十年可能会达到新的里程碑 来源&#xff1a;cnBeta.COM据外媒报道&#xff0c;人们的平均寿命越来越长&#xff0c;而经历“极端长寿”的人的数量也同样在增加。尽管大多数人活不到100岁&#xff0c;但数据显示&#xff0c;在过…

.NET Framework 4.7发布,支持Windows 10创作者更新

微软刚刚发布了 .NET Framework 4.7&#xff0c;主要是带来了对 Windows 10 “创作者更新” 的支持&#xff0c;开发者们可以通过 Visual Studio 2017 进行最新版 .NET Framework 项目的开发。 .NET Framework 4.7 包含了以下几大改进&#xff1a; 加入对 Windows 10 表格应用…

Spark SQL 中UDF的讲解

Spark SQL 中UDF的讲解 User Define Function, 用户自定义函数,简称UDF,存在与很多组件中。 在使用Sparksql的人都遇到了Sparksql所支持的函数太少了的难处&#xff0c;除了最基本的函数&#xff0c;Sparksql所能支撑的函数很少&#xff0c;肯定不能满足正常的项目使用&#xf…

Redis面试总结

转载自 Redis面试总结 1、什么是Redis? Redis 是一个基于内存的高性能key-value数据库。 (有空再补充&#xff0c;有理解错误或不足欢迎指正) 2、Reids有哪些特点&#xff1f; Redis本质上是一个Key-Value类型的内存数据库&#xff0c;很像memcached&#xff0c;整个数据…

jquery动画与事件案例

代码都已经测试通过&#xff0c;直接打开注释即可看见效果&#xff01; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><script src"js/jquery-1.8.3.js" type"text/javascript" c…

两路语音 两路计算机数据综合,脉冲编码调制解调实验摘要.doc

2012-2013 第二学期开放实验项目题  目&#xff1a;两路话音&#xff0b;两路计算机数据综合传输系统实验学生姓名专业名称&#xff1a;  电子信息工程指导教师&#xff1a;2013年 5月 20日脉冲编码调制解调实验实验原理(一)基本原理PCM 调制原理框图量化从数学上来看&…

2016蓝桥杯省赛---java---C---10(密码脱落)

题目描述 思路分析 将字符串反转&#xff0c;后寻找到最长子串&#xff0c;然后用字符串长度减去最长字串长度即可。 代码实现 package lanqiao;import java.util.Scanner;public class Main {static int min0,num0;static String str;public static void main(String[] arg…

Java多线程面试问题

转载自 Java多线程面试问题 这篇文章主要是对多线程的面试问题进行总结的&#xff0c;罗列了40个多线程的问题。 1、多线程有什么用&#xff1f; 一个可能在很多人看来很扯淡的一个问题&#xff1a;我会用多线程就好了&#xff0c;还管它有什么用&#xff1f;在我看来&…