0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring中经典的9种设计模式

jf_ro2CN3Fa 来源:芋道源码 2023-12-11 09:56 次阅读

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

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

第一种:简单工厂

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

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

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




Hello!这是singletonBean!value>





Hello!这是itxxzBean!value>





第二种:工厂方法(Factory Method)

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

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

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

importjava.util.Random;
publicclassStaticFactoryBean{
publicstaticIntegercreateRandom(){
returnnewInteger(newRandom().nextInt());
}
}

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


测试:

publicstaticvoidmain(String[]args){

//调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例
XmlBeanFactoryfactory=newXmlBeanFactory(newClassPathResource("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

publicinterfaceAdvisorAdapter{

booleansupportsAdvice(Adviceadvice);

MethodInterceptorgetInterceptor(Advisoradvisor);

}

MethodBeforeAdviceAdapter类,Adapter

classMethodBeforeAdviceAdapterimplementsAdvisorAdapter,Serializable{

publicbooleansupportsAdvice(Adviceadvice){
return(adviceinstanceofMethodBeforeAdvice);
}

publicMethodInterceptorgetInterceptor(Advisoradvisor){
MethodBeforeAdviceadvice=(MethodBeforeAdvice)advisor.getAdvice();
returnnewMethodBeforeAdviceInterceptor(advice);
}

}

第五种:包装器(Decorator)

在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往在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中有如下代码说明了策略模式的使用情况:

cc79e0e0-97c5-11ee-8b88-92fbcf53809c.jpg

第九种:模板方法(Template Method)

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

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

以下是一个具体的例子:

JdbcTemplate中的execute方法

cc8c36fa-97c5-11ee-8b88-92fbcf53809c.jpg

JdbcTemplate执行execute方法

cc9ef47a-97c5-11ee-8b88-92fbcf53809c.jpg








审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 适配器
    +关注

    关注

    8

    文章

    1824

    浏览量

    66960
  • AOP
    AOP
    +关注

    关注

    0

    文章

    37

    浏览量

    11049

原文标题:Spring 中经典的 9 种设计模式,打死也要记住啊!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Spring状态机的实现原理和使用方法

    说起 Spring 状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring 状态机就是状态模式的一种实现,在
    的头像 发表于 12-26 09:39 978次阅读
    <b class='flag-5'>Spring</b>状态机的实现原理和使用方法

    java spring教程

    java spring教程理解Spring 实现原理掌握Spring IOC,AOP掌握Spring的基础配置和用法熟练使用SSH开发项目Sprin
    发表于 09-11 11:09

    什么是java spring

    ; 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这
    发表于 09-11 11:16

    spring实例

    spring实例spring至关重要的一环就是装配,即配置文件的编写,接下来我按刚才实际过程中一步步简单讲解。  首先,要在web.xml中配置DispatcherServlet,它是作为
    发表于 09-11 11:22

    Spring工作原理

    Spring所提供的这些服务和功能。Spring里用的最经典的一个设计模式就是:模板方法模式。(这里我都不介绍了,是一个很常用的设计
    发表于 07-10 07:41

    Spring框架的设计理念

    Spring作为现在最优秀的框架之一,已被广泛的使用,51CTO也曾经针对Spring框架中的hqC应用做过报道。本文将从另外一个视角试图剖析出Spring框架的作者设计Spring
    发表于 07-15 08:17

    Spring Boot连接数据库的三方式

    Spring Boot——三方式连接数据库
    发表于 04-20 07:58

    Spring笔记分享

    框架:高度抽取,可重用代码的一设计高度的通用性多个可重用模块的集合,形成某个领域的整体解决方案Spring => 容器框架包含并管理应用对象的生命周期IOC和SOP容器框架容器 =>
    发表于 11-04 07:51

    启动Spring Boot项目应用的三方法

    基础。我们知道了Spring Boot是个什么了,那么我们又该如何启动Spring Boot应用呢?这里小编给大家推荐常用的三方法。分别是IDEA编辑器启动、命令启动、java命令jar文件启动。下面
    发表于 01-14 17:33

    spring教程ppt

    主要内容Spring 概述Spring 整体结构Spring实例Spring核心概念介绍控制反转(IOC)依赖注入(DI)
    发表于 09-11 11:00 138次下载
    <b class='flag-5'>spring</b>教程ppt

    PCB设计中经典技巧总结

    PCB设计中经典技巧总结 1.在protel99中如何添加原tango中的库(如TTL.LIB/COMS.LIB等)     在protel99中添加库的方法:在自己的ddb文件中(
    发表于 04-16 18:11 3187次阅读

    Spring应用 1 springXML配置说明

    开发过程。会使用注解形式的开发模式。但使用相应的注解需要spring.xml中定义相应的BeanProcessor,这样显得很笨重。 使用@Autowired注解,必须事先在Spring容器中声明
    发表于 01-13 12:20 317次阅读

    Spring认证_什么是Spring GraphQL

    Spring GraphQL 为构建在 GraphQL Java 上的 Spring 应用程序提供支持。两个团队之间的联合联合。我们的共同理念是少固执己见,更专注于全面和广泛的支持。 Spring
    的头像 发表于 08-06 14:30 523次阅读
    <b class='flag-5'>Spring</b>认证_什么是<b class='flag-5'>Spring</b> GraphQL

    Spring认证」什么是Spring GraphQL?

    这个项目建立在 Boot 2.x 上,但它应该与最新的 Boot2.4.x5 相关。 要创建项目,请转到start.spring.io并为要使用的GraphQL传输选择启动器: 启动机 运输 执行
    的头像 发表于 08-10 14:08 613次阅读
    「<b class='flag-5'>Spring</b>认证」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring MVC的工作原理

    Spring MVC是一种基于Java的Web应用程序框架,它采用了Model-View-Controller(MVC)设计模式来分离应用程序的不同方面。Spring MVC的工作原理涉及多个关键
    的头像 发表于 12-03 11:49 477次阅读