Spring及工厂模式概述

文章目录

  • Spring 身世
  • 什么是 Spring
  • 什么是设计模式
  • 工厂设计模式
    • 什么是工厂设计模式
    • 简单的工厂设计模式
    • 通用的工厂设计
  • 总结


在这里插入图片描述

Spring 框架出现之前,Java 开发者使用的主要是传统的 Java EE(Java Enterprise Edition)平台。Java EE 是一套用于开发企业级应用程序的规范,其中包含了众多的标准和 API,如 Servlet、JSP、EJB、JPA 等。

在 Java EE 平台中,应用程序通常是基于各种不同的技术和规范进行构建的,这些技术和规范的配置和集成往往需要大量的手工工作和复杂的部署过程。开发者需要手动管理对象的生命周期和依赖关系,并编写大量的样板代码来处理框架和平台所要求的要求

Spring 框架的出现改变了这种开发方式。它引入了依赖注入和面向切面编程等新概念,通过 IOC 容器来管理对象的创建和依赖关系,简化了应用程序的开发和配置。

Spring 的设计目标之一是提供一种轻量级的框架,使得开发者能够更加专注于业务逻辑的实现而不是框架的配置和集成。

因此,Spring 的出现引领了一种新的开发范式,简化了企业级应用程序的开发流程,提供了更高效和灵活的开发方式,深受 Java 开发者的喜爱。


img

Spring 身世

2002年,Rob Johnson 撰写了一本名为《J2EE设计和开发》的书。本书主要概括了当时Java企业应用程序开发的现状以及指出了JavaEE规范中EJB框架的缺陷,并在书中基于普通Java类和设计模式提出了更为简单的解决防范。

同年在《J2EE Devlopment Without EJB》一书中,进一步扩展了 Interface21的代码,衍生而来了一个轻量级J2EE开发解决方案----Spring

2004年3月在Sourceforge正式发布了Spring框架的第一个版本。


什么是 Spring

Spring是⼀个轻量级的JavaEE解决⽅案,整合众多优秀的设计模式

  • 轻量级
    • 对于运行环境是没有额外要求的
    • 代码移植性高 不需要实现额外接口

  • 整合设计模式
    • 工厂设计模式
    • 代理设计模式
    • 模板设计模式
    • 策略设计模式

什么是设计模式

  1. ⼴义概念 ⾯向对象设计中,解决特定问题的经典代码
  2. 狭义概念 GOF4⼈帮定义的23种设计模式:⼯⼚、适配器、装饰器、⻔⾯、代理、模板…

工厂设计模式

什么是工厂设计模式

  1. 概念:通过⼯⼚类,创建对象

    //	反例
    User user = new User(); UserDAO userDAO = new UserDAOImpl(); 
    
  2. 好处:解耦合

    • 耦合:指定是代码间的强关联关系,⼀⽅的改变会影响到另⼀⽅

    • 问题:不利于代码维护

    • 简单:把接⼝的实现类,硬编码在程序中

      //	硬编码
      UserService userService = new UserServiceImpl(); 
      

简单的工厂设计模式

  1. 最初的硬编码
//	这个硬编码是有耦合的
UserService userService = new UserServiceImpl(); 
  1. 简单工厂模式设计
public class BeanFactory{public UserService getUserService(){return new UserServiceImpl();}
}

用 BeanFactory 获取:解耦合

UserService userService = BeanFactory.getUserService(); 
  1. 第2步的简单工厂 BeanFactory 里的 getUserService() 方法其实还是有耦合(解耦不彻底)

改造 BeanFactory 通过反射去获取其对象.

public class BeanFactory{public UserService getUserService(){UserService userService = null;try {Class clazz =Class.forName("com.snow.service.UserServiceImpl");userService = (UserService) clazz.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return userService;}}
  1. 第3步的类路径其实还是有耦合

可以继续改造第3步,将类路径字符型放在配置文件中。

public class BeanFactory{private static Properties env = new Properties();static{try {//第⼀步 获得IO输⼊流InputStream inputStream =BeanFactory.class.getResourceAsStream("/applicationContext.properties");//第⼆步 ⽂件内容 封装 Properties集合中 //key = userService value = com.snow.service.UserServiceImplenv.load(inputStream);inputStream.close();} catch (IOException e) {e.printStackTrace();}}public UserService getUserService(){UserService userService = null;try {//	该路径是从配置文件读取来的Class clazz = Class.forName(env.getProperty("userService"));userService = (UserService) clazz.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return userService;}}

通用的工厂设计

回顾 上一步 简单工厂模式,发现当需要获取多个对象时,就需要多个工厂,这就会造成的大量的代码冗余。

SO , 我们来改造下,通过传入对象的 key, 来获得其对象.

public class BeanFactory{public static Object getBean(String key){Object ret = null;try {Class clazz = Class.forName(env.getProperty(key));ret = clazz.newInstance();} catch (Exception e) {e.printStackTrace();}return ret;}
}

总结

总结起来,Spring 的灵魂就是工厂模式的应用.


在这里插入图片描述



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

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

相关文章

《Docker 简易速速上手小册》第3章 Dockerfile 与镜像构建(2024 最新版)

文章目录 3.1 编写 Dockerfile3.1.1 重点基础知识3.1.2 重点案例:创建简单 Python 应用的 Docker 镜像3.1.3 拓展案例 1:Dockerfile 优化3.1.4 拓展案例 2:多阶段构建 3.2 构建流程深入解析3.2.1 重点基础知识3.2.2 重点案例:构建…

港科夜闻|香港科大计划建立北部都会区卫星校园完善科大创新带,发展未来创新科技 未来医药发展及跨学科教育...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大计划建立北部都会区卫星校园完善“科大创新带”,发展未来创新科技、未来医药发展及跨学科教育。香港科大校长叶玉如教授在2月22日的媒体会议上表示,香港科大将在北部都会区建立卫星校园&a…

open3d KD-Tree K近邻点搜索

open3d KD-Tree K近邻点搜索 一、算法原理1.KD-Tree 介绍2.原理 二、代码三、结果1.原点云2.k近邻点搜索后的点云 四、相关数据 一、算法原理 1.KD-Tree 介绍 kd 树或 k 维树是计算机科学中使用的一种数据结构,用于在具有 k 维的空间中组织一定数量的点。它是一个…

【Spring MVC】处理器映射器:AbstractHandlerMethodMapping源码分析

目录 一、继承体系 二、HandlerMapping 三、AbstractHandlerMapping 四、AbstractHandlerMethodMapping 4.1 成员属性 4.1.1 MappingRegistry内部类 4.2 AbstractHandlerMethodMapping的初始化 4.3 getHandlerInternal()方法:根据当前的请求url,…

从git上clone项目到本地后启动时的一种报错

当我们从git上拉项目到本地之后,先install,但启动时可能会出现报错,例如上面这种报错,这时候我们需要把package.json里的vite改一下,例如改成2.6.13,之后删掉node_modules,重新install,再启动一下,就好了。…

OT 安全解决方案:探索技术

IT 和 OT 安全的融合:更好的防御方法 OT 安全解决方案下一个时代: 为了应对不断升级的威胁形势,组织认识到迫切需要采用统一的信息技术 (IT) 和运营技术 (OT) 安全方法。IT 和 OT 安全的融合代表了一种范式转变,承认这些传统孤立领…

音频smmu问题之smmu学习

一、音频smmu 内存访问问题 在工作中,遇到一个smmu问题,主要log信息如下: arm-smmu 15000000.apps-smmu: Unhandled arm-smmu context fault from soc:spf_core_platform:qcom,msm-audio-ion! arm-smmu 15000000.apps-smmu: FAR 0x0000000…

什么是负载均衡集群?

目录 1、集群是什么? 2、负载均衡集群技术 3、负载均衡集群技术的实现 4、实现效果如图 5、负载均衡分类 6、四层负载均衡(基于IP端口的负载均衡) 7、七层的负载均衡(基于虚拟的URL或主机IP的负载均衡) 8、四层负载与七层…

(3)(3.6) 用于OpenTX的Yaapu遥测脚本

文章目录 前言 1 安装和操作 2 参数说明 前言 这是一个开源 LUA 脚本,用于在使用 OpenTX 2.2.3 的 Horus X10、X12、Jumper T16、T18、Radiomaster TX16S、Taranis X9D、X9E、QX7 和 Jumper T12 无线电设备上显示 FrSky 的直通遥测数据(FrSky passthrough telem…

Linux配置jdk、tomcat、mysql离线安装与启动

目录 1.jdk安装 2.tomcat的安装(开机自启动) 3.MySQL的安装 4.连接项目 1.jdk安装 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录,将安装包拖进去 解压安装包 这里需要解压到usr/local目录下,在这里我新建一个文件夹…

【Vue3】学习computed计算属性

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

NXP实战笔记(十):S32K3xx基于RTD-SDK在S32DS上配置CAN通信

目录 1、概述 2、SDK配置 2.1、配置目标 2.2、CAN配置 3、代码实现 4、测试结果 1、概述 S32K3xx的FlexCan与之前的S32K1xx很相似,Can的中断掩码寄存器(IMASK3)与中断标志位寄存器(IFLAG3)依赖于邮箱数。 FlexCan配置实例如下 FlexCan的整体图示如下 Protocol Engine…

PyTorch概述(六)---View

Tensor.view(*shape)-->Tensor 返回一个新的张量同之前的张量具有相同的数据,但是具有不同的形状;返回的张量同之前的张量共享相同的数据,必须具有相同数目的元素,可能具有不同的形状;对于经过view操作的张量&…

Python中操作MySQL和SQL Server数据库的基础与实战【第97篇—MySQL数据库】

Python中操作MySQL和SQL Server数据库的基础与实战 在Python中,我们经常需要与各种数据库进行交互,其中MySQL和SQL Server是两个常见的选择。本文将介绍如何使用pymysql和pymssql库进行基本的数据库操作,并通过实际代码示例来展示这些操作。…

Visual Studio:Entity设置表之间的关联关系

1、选择表并右键-》新增-》关联 2、设置关联的表及关联关系并“确定”即可

真的是性能优化(压测)-纯思想

文章目录 概要优化指标-MD都是文字看看就行性能优化操作1、代码优化:2、系统配置与环境优化:3、架构与设计:4、~~实施与监控:~~5、~~开发流程和环境管理:~~ 总结 概要 性能优化是一个持续的过程,需要监控、…

神经网络系列---感知机(Neuron)

文章目录 感知机(Neuron)感知机(Neuron)的决策函数可以表示为:感知机(Neuron)的学习算法主要包括以下步骤:感知机可以实现逻辑运算中的AND、OR、NOT和异或(XOR)运算。 感知机(Neuron) 感知机(Neuron)是一种简单而有效的二分类算法,用于将输入…

android input命令支持多指触摸成果展示-千里马framework实战开发

hi input命令扩展提示部分 generic_x86_64:/ # input -h Error: Unknown command: -h Usage: input [<source>] <command> [<arg>...]The source…

数智化转型的三大关键点

一、重新认识数智化转型 消费红利时代&#xff0c;伴随中国宏观经济向好发展&#xff0c;相当一部分企业可以轻松实现快速增长&#xff0c;如同搭乘了一架高速运转的电梯一路飞升。然而&#xff0c;随着宏观经济增速放缓&#xff0c;时代的电梯逐渐失去效力&#xff0c;中国商…

python3 Flask jwt 简易token认证实例

直接上代码 from flask import Flask, jsonify, request, make_response import jwt import datetime from functools import wrapsapp Flask(__name__)# 这是一个示例密钥&#xff0c;实际应用中应该使用一个复杂且随机的密钥 app.config[SECRET_KEY] your_secret_keydef t…