Spring及工厂模式概述

news2024/11/18 7:46:37

文章目录

  • 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.UserServiceImpl
            env.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.coloradmin.cn/o/1467014.html

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

相关文章

SwiftUI 支持拖放功能的集合视图(Grid)如何捕获手指按下并抬起这一操作

功能需求 假设我们开发了一款 SwiftUI 应用,其中用户可以通过拖放 Grid 中的 Cell 来完成一些操作。现在,我们希望用户在某个 Cell 被按下并随后抬起手指时得到通知,这能够实现吗? 如上图所示,我们准确地捕获到了手指在 Grid 的 Cell 上按下再抬起这一操作!那么它是如何…

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四(leetcode真题剖析)

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习四 01.解数独02.单词搜索03.黄金矿工04.不同路径 III 01.解数独 题目链接:https://leetcode.cn/problems/sudoku-solver/ 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&am…

亿道丨三防平板丨加固平板丨为零售业提供四大优势

随着全球经济的快速发展,作为传统行业的零售业也迎来了绝佳的发展机遇,在互联网智能化的大环境下,越来越多的零售企业选择三防平板电脑作为工作中的电子设备。作为一种耐用的移动选项,三防平板带来的不仅仅是坚固的外壳。坚固耐用…

第十四章[面向对象]:14.9:定制类

一,__len__()方法返回长度 1,len()函数 len()函数: 功能:len() 函数返回对象(字符、列表、元组等)长度或项目个数 语法: len( s ) 参数:s : 要查询长度的对象 返回值: 返回对象长度 2,没有定义__len__()方法时,对实例应用len()函数会引发TypeError class Student: …

T-Dongle-S3开发笔记——分区表

参考: ESP32之 ESP-IDF 教学(十三)—— 分区表_esp32分区表-CSDN博客 分区表 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 分区表是 ESP32 划分内部 flash 闪存的清单,它将 flash 划分为多个不同功能的区域用于…

【Java程序设计】【C00296】基于Springboot的4S车辆管理系统(有论文)

基于Springboot的4S车辆管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的4S店车辆管理系统 本系统分为销售员功能模块、管理员功能模块以及维修员功能模块。 管理员功能模块:管理员登录进入4S…

ubantu设置mysql开机启动

阅读本文之前请参阅----MySQL 数据库安装教程详解(linux系统和windows系统) 在Ubuntu系统中设置MySQL开机启动,通常有以下几种方法: 1. **使用systemctl命令**: Ubuntu 16.04及更高版本使用systemd作为…

【若依(ruoyi)】Java---如何在Apifox上传params参数--延伸--如何在Apifox上传Map类型参数

在使用若依开发过程中写接口的时候想在params中添加参数,但是使用params.key这种形式在后端是接收不到传过来的参数的,于是百般调研(百度),终于找到一个解决办法,就是在参数前后加上%5B和%5D,这两个参数会被编译为"["和"]",于是就对得上了,后端成功接受到参…

设计模式: 策略模式

文章目录 一、什么是策略模式二、策略模式结构三、使用场景案例分析1、使用场景2、案例分析(1)消除条件分支 一、什么是策略模式 策略模式是一种行为型设计模式,它允许定义一组算法,并将每个算法封装在独立的类中,使它…

UE5 C++ 创建可缩放的相机

一.要将相机设置在Pawn类里 1.在MyPawn头文件里,加上摇臂和相机组件 #include "GameFramework/SpringArmComponent.h" #include "Camera/CameraComponent.h" 2.在Pawm里声明SceneComponet,SpringArmComponent,CameraComponent组件…

新手入门C语言之其他操作符以及操作符属性

一.逗号操作符 1.形式: exp1, exp2, exp3 ......逗号表达式:由逗号隔开的一串表达式 2.执行过程:从左到右依次执行每一个表达式,表达式的结果是最后一个表达式的结果 int main() {int a 1;int b 2;int c (a > b, a b…

给定长度为n(n<=20)的数组a,-20<=ai<=20, 每次操作选择i,j,使a[i] += a[j], 在31次操作内使a不递减,输出每次操作的i,j

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e18, maxm 4e4 5, …

SpringBoot项目实现文件上传,MINIO+OSS阿里云

MINIO 安装以及部署 官网&#xff1a;MinIO | Code and downloads to create high performance object storage 下载后是一个minio.exe的文件&#xff0c;可以先创一个文件夹来存放数据以及文件 在文件的目录下cmd进入控制台 minio.exe server data 启动成功后控制台会打印账…

代码随想录算法训练营第59天 | 583.两个字符串的删除操作 + 72.编辑距离 + 编辑距离总结篇

今日任务 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇 583.两个字符串的删除操作 - Medium 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以…

IntelliJ IDEA 创建Spring Boot 项目整合jdbc详细步骤

IntelliJ IDEA 创建Spring Boot 项目&整合jdbc详细步骤 1、打开 IntelliJ IDEA 软件2、使用 "Spring Initializr" 作为项目类型&#xff0c;新建项目工程3、选择对应的SpringBoot版本和依赖4、Spring Boot 项目的结构5、创建一个TestController&#xff0c;并运行…

个性化纹身设计,Midjourney带你探索独一无二的艺术之美

hello,大家好&#xff0c;欢迎回来。 在当今社会&#xff0c;纹身已经变得非常常见。 在寻求与众不同的个性化纹身时&#xff0c;你是否曾经为了找不到独特的设计而苦恼&#xff1f; 现在&#xff0c;Midjourney将为你打开一扇全新的艺术之门&#xff0c;引领你探索纹身设计…

matplotlib绘图初步

文章目录 绘制曲线图完整流程图像属性 绘制曲线图 matplotlib是python中最常用的可视化库&#xff0c;提供了不同坐标系下的二十余种常用图像&#xff0c;并且提供了动态图像绘制的方法&#xff0c;可以满足科学计算中的绝大多数可视化需求。而在matplotlib中&#xff0c;绝大…

基于Redis限流(固定窗口、滑动窗口、漏桶、令牌桶)(肝货!!!)

近期redis复习的比较多&#xff0c;在限流这方面发现好像之前理解的限流算法有问题&#xff0c;索性花了一天“带薪摸鱼”时间肝了一天&#xff0c;有问题可以评论区探讨。 废话不多说&#xff0c;正片开始 目录 Maven固定窗口滑动窗口算法漏桶算法令牌桶算法 Maven 有些不用的…

[HTML]Web前端开发技术28(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;佬佬会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

【计网】TCP的三次握手四次挥手

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 三次握手&#xff08;Connection Establishment&#xff09; 四次挥手&#xff08;Connection Termination&#xff09; 结语 我…