问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring主要运用那些设计模式,单例模式是怎么实现的?

发布网友 发布时间:2022-04-26 15:09

我来回答

1个回答

热心网友 时间:2022-04-06 03:37

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

今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以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>

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

通常由应用程序直接使用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);

}

}

第五种:包装器(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中有如下代码说明了策略模式的使用情况: 

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

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

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

spring框架中用到了哪些设计模式?

Spring中Observer模式常用的地方是Listener的实现。如ApplicationListener。 spring主要运用那些设计模式,单例模式是怎么实现的? 设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 今天,螃蟹在IT学习者网站就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有...

spring主要运用那些设计模式,单例模式是怎么实现的?

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

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

简单工厂模式,通过BeanFactory实现,基于唯一标识动态生成Bean对象,实现松耦合与额外处理。工厂方法模式,利用FactoryBean接口,其返回值并非Factory实例,而是Factory.getObject()方法返回的值,典型应用如Spring与MyBatis的集成。单例模式,Spring默认实现单例,通过AbstractBeanFactory的getSingleton()方法创建实例,...

spring动态数据源使用的设计模式

观察者模式(Observer Pattern):观察者模式是Spring框架中用于实现事件驱动的一种设计模式。Spring的事件驱动机制基于观察者模式,可以实现Bean之间的解耦。通过定义事件监听器和发布事件,我们可以在应用中实现一对多的通信。例如,Spring中的ApplicationEvent和ApplicationListener接口就是用于实现观察者模式。5、模...

spring动态数据源使用到的设计模式

1、工厂模式 工厂模式是Java中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。2、单例模式 单例模式是最简单的设计模式之一。这种模式涉及到一个单一的...

spring框架中都用到了哪些设计模式?

候选者列举了一些常见的设计模式在 Spring 中的运用,如工厂模式(通过 ApplicationContext 或 BeanFactory 获取对象),单例模式(源码里使用 DCL 实现),代理模式(底层原理)以及模板方法模式(在事务管理器中应用),观察者模式(事件驱动模型的实现)。面试官进一步询问了候选者熟悉的设计模式,候选者...

spring用了哪些设计模式

4.策略模式,第一个地方,加载资源文件的方式,使用了不同的方法,比如:ClassPathResourece,FileSystemResource,ServletContextResource,UrlResource但他们都有共同的借口Resource;第二个地方就是在Aop的实现中,采用了两种不同的方式,JDK动态代理和CGLIB代理;5.单例模式,这个比如在创建bean的时候。

Spring 框架中都用到了哪些设计模式?

Spring框架中使用了多种设计模式,其中常用的有:1. 工厂模式(Factory Pattern):用于创建对象,将对象的创建和使用分离。2. 单例模式(Singleton Pattern):保证一个类只有一个实例,并提供一个全局访问点。3. 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。4. 模板方法...

单例模式介绍和使用场景及Spring单例模式的使用

1.什么是单例模式单例模式(SingletonPattern)是Java中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化...

spring依赖注入使用的什么设计模式?

依赖注入模式 依赖注入(Dependency Injection) 是一个非常简单的概念,伸手-等待。如例程1-1所示,Client依赖于抽象类型(甚至是具体类) IServer,蛋是(1)Client的类体中不创建IServer(子类)的对象,它不想自己创建IServer对象,而是提供public的构造器Client(IServer)或设置方法setIServer (IServer)等(伸手...

spring如何实现单例模式 spring中哪些是单例模式 spring单例模式实现原理 spring为啥是单例模式 spring默认是单例模式吗 spring是单例还是多例 spring单例模式 springmvc单例模式 spring为什么使用单例
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...+sinB+sinC=0,cosA+cosB+cosC=0, 求证:cos(A+B)=-1/2 ...abc中,sinA(sinB+cosB)-sinC=0,sinB+cosC=0,求A,B的值 三角函数 已知sinA+sinB+sinC=0 cosA+cosB+cosC=0 求证:sin2A+sin2B... 已知sinA+sinB=sinC,cosA+cosB=cosC,求cos(A-B)的值 锐角三角形ABC中,比较sinAsinBsinC与cosAcosBcosC的大小 tanA tanB tan C sinA sinB sinC cosA cosB cosC 赵志杭“陶太太”捧红 是谁在六盘水火车站唱酒杯杯高来酒杯杯低里? 火车上酒杯可以携带吗 火车上酒杯能不能带 火车上让带小玻璃酒杯吗有几十个 spring的单例模式如何实现? 什么是单例模式?希望有个运用单例模式的类的例子。 单例模式有哪两种设计方法,用文字和代码分别说明 么是单例模式,并写出单例模式的2种实现方式。 单例模式有几个实现的方法呢? 网站优化领先型? 网站SEO优化报价方案:SEO多少钱一个关键词 企业为什么必须要做网站SEO优化 网站优化提高型? SEO框架型网页的优化技巧有哪些 泊头哪有做优化型网站的 做的好一些的 千佳网络工作室给企业做的优化型网站免费帮客户优化真的不收钱吗 请问你们做一个优化型的企业网站需要多少钱? 大家谁知道哪里有做优化型网站的 做的好一些的 OPPOr11s 可以放置SD卡吗,如果能,在哪里显示 想做一个优化型的网站 请问哪里做? oppo r11s 能扩展内存吗 商丘seo:优化型网站怎么挑选网站空间服务器 网站的主题就是为自己的网站选择一个较好的什么和标题 oppor11s能不能上两张电信的卡 如何实现单例模式? Python中的单例模式的几种实现方式的及优化 数据库链接为什么要用单例模式?有什么好处吗 微信公众号怎么插入多个外链 微信公众平台正文内怎么插入多个链接 微信个人订阅号的自定义菜单中怎么设置多个链接? 微信公众平台里的素材怎么在一个图文消息里添加多个链接? 你有没有为别人拼过命 这个歌曲在抖音里面怎么才找得到? 微信公众号每天的一条消息下面还有3,4个文章的链接,这是如何做到的。 微信公众号的子菜单只能添一个链接嘛 微信公众平台个人订阅号发布的素材怎么在一个图文了解里添加多个小链接?如图! 微信公众号里子菜单下又进入一个页面有多个模块,并且有链接功能是怎么实现的? 一个微信公众号可以链接几个店铺啊? 一般客人怎么样才能自己到酒店看到一个多月前来酒店的监控录像,自己去能有什么办法? 怎么在微信公众号做个链接有自己产品选择搭配 怎么用微信公众号发链接消息,就像这种直接一句话一个链接的 如何调取宾馆监控录像 请教如果是住酒店本人可以去酒店要求看某一天入住的监控录像吗?是本人要求,是否可以带本人身份证要求看 蓝牙连接状态下微信运动怎么不记步 可以在手机上制作app的软件有哪些?