Spring中的设计模式

Spring中的设计模式

设计模式:表示面向对象软件开发中最好的计算机编程实践。

1、 工厂模式(ioc是一种思想,但DI注入是ioc思想的结果行为,是工厂设计模式)

(1)通过BeanFactory或ApplicationContext容器创建Bean对象

ApplicationContext的三个实现类:

=1、ClassPathXmlApplication:把上下文文件当成类路径资源

=2、FileSystemXmlApplication:从文件系统中的XML文件载入上下文定义信息。

=3、XmlWebApplicationContext:从Web系统中的XML文件载入上下文定义信息。

(2)区别:

=1、BeanFactory: 容器启动时,延迟注入bean依赖,要使用某个bean时才会注入,内存占用更少,程序启动更快。

=2、ApplicationContext:容器启动时,所有的bean都会被创建。

=3、BeanFactory提供最基本的依赖注入支持

=4、ApplicationContext扩展了BeanFactory,有更强大的功能

2、单例模式

某些对象只需要一个实例就好,多个实例会导致资源使用过量,不一致性结果等异常。 (例如:线程池、缓存、对话框、注册表、日志对象、充当打印机、显卡等设备驱动程序的对象)

(1)单例的好处:减少频繁使用的对象的创建的时间,创建一次就好;

new操作次数减少,降低内存的使用频率,减轻GC

(2)Spring中的单例

=1、bean的默认作用域 singleton(单例)

=2、实现单例的方式:

注解:@Scope(value=”singleton”)

3、代理模式

(1)Spring中的代理设计模式 AOP AspectJ

(2)AOP:面向切面编程,将非业务的模块抽取出来,正常运行,降低耦合

=基于动态代理

1、要代理的对象实现了某个接口,使用JDK动态代理,创建代理对象(实现接口)

2、要代理的对象没有实现接口,使用CGLIB动态代理,会生成一个被代理对象的子类来作为代理(继承)

4、模板模式

定义一个操作中的算法的骨架,由子类继承该算法并实现。

(1)XXXTemplate结尾的类,例如:jdbcTemplate、redisTemplate等

(2)使用继承来实现模板模式,实现代码复用的效果,增加灵活性

5、观察者模式

对象行为模式,表示一种对象间的依赖关系,一个对象发生改变,所依赖的对象也要改变。

(1)Spring中经典应用——Spring事件驱动模型

事件流程:=1、定义事件 继承ApplicationEvent,重载构造函数

=2、定义一个事件监听者,实现ApplicationListener接口,重写onApplicationEvent()方法

=3、使用事件发布者发布信息:调用ApplicationEventPublisher.publishEvent()方法发布信息。

6、适配器模式

适配器模式使接口不兼容的类一起工作,将一个接口转换成客户希望的另一个接口。

(1) AOP中的适配器模式——增强或通知Advice

=1、相关的接口 AdvisorAdapter

=2、 通知——拦截器——适配器

通过对应的适配器,适配成MethodInterceptor接口(方法拦截器)类型的对象,再负责适配通知

==通知只是定义了增强时将要被调用的方法

==方法具体何时调用需要由通知对应的拦截器来进行管理

==适配器的作用就是根据通知得到其对应的拦截器

=== BeforeAdvice(目标方法调用前,前置通知),对应的拦截器 MethodBeforeAdviceInterceptor

===AfterAdvice(目标方法调用后,后置通知),对应的拦截器 AfterReturningAdviceInterceptor

=== AfterReturningAdvice(目标方法执行结束后,return之前),对应的拦截器AfterReturningAdviceInterceptor

(2) MVC中的适配器

=1、MVC中适配器流程

==DispatcherServlet根据请求信息调用HandlerMapping,解析请求对应的Handler(即解析到对应的Controller控制器)

==解析获取对应Handler后,由HandlerAdapter适配器处理

==HandlerAdapter适配器接口,器实现类对目标类Controller类进行适配,

=2、为什么MVC要使用适配器模式

SpringMVC中Controller类型多,不同类型的Controller要使用不同的方法对请求进行处理,没有使用适配器模式,则DispatcherServlet直接获取对应类型的Controller,需要自行判断,同时增加Controller类型需要对代码进行改变,增加了耦合性。

7、装饰者模式

装饰者模式可以动态给对象添加一些额外的属性或行为,比使用继承更加灵活。

Spring中配置DataSource的数据库和数据源的确认,可能访问不同的数据库,通过装饰者模式能够准确地动态切换不同的数据源。

Original: https://www.cnblogs.com/hexiayuliang666/p/16147977.html
Author: 与长安故里
Title: Spring中的设计模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570774/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • nginx访问控制

    一、基于IP的访问控制 1、http_access_module a、配置语法 Syntax: allow address | CIDR | unix: | all; Defaul…

    Java 2023年5月30日
    076
  • Spring Cloud Alibaba 之 Sentinel 限流规则和控制台实例

    这一节我们通过一个简单的实例,学习Sentinel的基本应用。 一、Sentinel 限流核心概念 在学习Sentinel的具体应用之前,我们先来了解一下Sentinel中两个核心…

    Java 2023年5月30日
    077
  • Mybatis 如何在IDEA中添加配置模板

    Mybatis 如何在IDEA中添加配置模板 第一步:点击File -> setting ->找到Editor点击->找到File and Code Templa…

    Java 2023年6月7日
    076
  • MySQL——索引

    1、索引:一种用于快速查询和检索数据的数据结构 B树、B+树、Hash 2、优缺点: =(1)优点:可以大大加快数据的检索速度、创建唯一性索引可以保证数据库表中每行数据的唯一性;一…

    Java 2023年6月5日
    069
  • 分布式锁

    分布式锁 本文整理自黑马程序员相关资料 问题的引入 在平时单服务的情况下,我们使用互斥锁可以保证同一时刻只有一个线程执行自己的业务。原理是,在JVM内部维护了一个锁监视器,锁监视器…

    Java 2023年6月8日
    063
  • Java指令重排序在多线程环境下的应对策略

    指令重排在单线程环境下有利于提高程序的执行效率,不会对程序产生负面影响;在多线程环境下,指令重排会给程序带来意想不到的错误。 本文对多线程指令重排问题进行复原,并针对指令重排给出相…

    Java 2023年6月6日
    077
  • Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!

    前言 本篇主要要介绍的就是 controller层的处理,一个完整的后端请求由4部分组成: 接口地&#x5…

    Java 2023年5月29日
    084
  • 【HarmonyOS】【JAVA UI】HarmonyOS 网络HttpURLConnection的基本使用

    ​ 参考资料 权限开发指导 线程管理 在鸿蒙(HarmonyOS)环境下,优雅的完成Http访问网络【教程】 api讲解 创建 url URL url=new URL(urlstr…

    Java 2023年5月29日
    0132
  • 某CTF比赛writeup

    看到群里别人参加比赛发上来的附件,自己尝试解了一下。 1、提示RSA,提供flag.enc和pub.key附件 一看就是解RSA,公钥分解得到n和e n=8693448229604…

    Java 2023年6月5日
    083
  • java中的一维数组

    数组(array):是一种用于存储多个相同数据类型的存储模型(可以理解为容器) 数组定义和静态初始化 数组的两种定义格式: 格式1: 数据类型[] 变量名; 范例: int[] a…

    Java 2023年6月15日
    078
  • 无聊科技正经事周刊(第2期):线上马拉松你会参加吗?

    这里记录每周值得分享的科技内容,周三发布。 本刊开源(GitHub: senlypan/weekly),欢迎投稿,推荐或自荐文章/软件/资源,请提交 issue 。 封面图 世界上…

    Java 2023年6月13日
    072
  • Spring MVC

    关于能用Spring怎样简化Web开发,想必大家已经好奇有段时间了。毕竟简化Web开发是Spring重头戏中的重头戏,也是我们学习Spring的主要目的。至于Spring是怎样简化…

    Java 2023年6月5日
    083
  • 【刷题】面筋-JAVA-hashmap和hashtable

    底层都是数组+链表实现 hashMap HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增…

    Java 2023年5月29日
    073
  • 第一个mybatis程序

    2、第一个mybatis程序 思路:搭建环境—>导入mybatis—>编写代码—>测试! 2.1、搭建环境 搭建数据库 CRE…

    Java 2023年6月13日
    082
  • 让工作事半功倍的常用思考框架及关于方法论的思考

    我们真正需要的不是方法论,而是明察秋毫、洞若观火的观察力和感受力。 基本原理 结构化分析法则:从事物或活动中抽取要素及关联,围绕要素和关联构成骨架结构,填充血肉,呈现内容。 多维度…

    Java 2023年6月9日
    067
  • CDH6.3.2升级Hive到4.0.0

    升级目的:为上层开发,提供统一元数据服务并能通过hive操作kudu表,kylin可以通过hive对在kudu中的数据做分析 面临问题:hive4.0之前hive没有KuduSto…

    Java 2023年6月6日
    069
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球