Spring是什么?为什么要使用Spring?

目录

前言

一、Spring是什么?

1.1 轻量级

1.2 JavaEE的解决方案

二、为什么要使用Spring

2.1 传统方式完成业务逻辑

2.2 使用Spring模式完成业务逻辑

三、为什么使用Spring?


前言

本文主要介绍Spring是什么,并且解释为何要去使用Spring,通过一个实际的案例来展示了Spring的强大之处。通过本章正式开始Spring的学习!


一、Spring是什么?

Spring是一个轻量级的Java企业开发的解决方案,整合了许多优秀的设计模式。

1.1 轻量级

  • 对于运行环境是没有要求的

        开源的可以,收费的也可以

  • 代码的移植性高

        不要实现额外的接口

1.2 JavaEE的解决方案

为什么说Spring是JavaEE中的解决方案呢,在项目开发的过程中类似于Mybatis这种框架只是针对于DAO这一层进行操作,但是Spring对每一个层次都有相对的解决方案,所以这里称Spring为JavaEE中的解决方案。

二、为什么要使用Spring

2.1 传统方式完成业务逻辑

上面只是简单的介绍了一下Spring,对于Spring详细介绍后面再来分析,接下来就分析一下为什么要使用Spring。

对于传统的创建对象的模式,我们是通过直接new对象的方式。假设我现在有一个User类,我要通过UserDao类进行业务操作,然后通过UserService对UserDao类进行控制操作。那么传统的方法就是一步一步的new对象。

1)首先,创建一个User类

public class User {private String id;private String name;
}

2)在UserDao中写出相应的业务操作

public class UserDao {public void login(String name, String password) {// 这里本来是需要写crud的具体操作的,但是为了演示方便就不写了System.out.println("name:"+name+",password:"+password);}
}

3)在UserService中进行相应的操作

public class UserService {UserDao userDao = new UserDao();public void login(String name, String password) {userDao.login(name, password);}
}

4)进行测试,模拟登录的过程

@org.junit.Test
public void test() {UserService userService = new UserService();User user = new User("张三","123456");userService.login(user);
}

此时该业务逻辑就完成了 

假设这个时候UserService过时了,我想重新写一个UserServiceNew来操作业务逻辑,对于传统的方式可能就需要对代码进行修改。但是在项目中对代码进行了修改,就意味着要重新测试并部署。

@org.junit.Test
public void test() {//UserService userService = new UserService(); UserServiceNew userServiceNew = new UserServiceNew();User user = new User("张三","123456");//userService.login(user);userServiceNew.login(user);
}

2.2 使用Spring模式完成业务逻辑

 此时就涉及解耦合,那么什么是耦合呢?

耦合:指定是代码之间的强联系关系,一方的改变就会影响到另一方

  • 不利于代码的维护
  • 将类硬编码在程序中

接下来就使用Spring模式再对上述业务逻辑进行操作。在测试的过程中,就不new Service对象了而是使用工厂模式去生产Service对象,这样可以解耦

创建一个工厂类

public class BeanFactory {public static UserService getUserService() {return new UserService();}
}

 此时利用工厂类再去创建UserService对象

@org.junit.Test
public void test() {//UserService userService = new UserService();UserService userService = BeanFactory.getUserService();User user = new User("张三","123456");userService.login(user);
}

这时候细心的同学可能就发现了,工厂类中也是new对象啊,那不还是有耦合。确实是这样的,接下来就对工厂类继续修改(由于测试流程是一致的,这里就不在展示测试过程)

public class BeanFactory {public static UserService getUserService() {// 这里使用反射创建对象UserService userService = null;try {Class clazz = Class.forName("com.gl.demo.UserService");userService = (UserService) clazz.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return userService;}
}

此时使用反射创建类对象大大降低了耦合,但是再细心一点的同学就会发现,那要是这个类名称变化了呢,这个代码还不是要修改 。说的对,接下来就是重头戏了,使用文件加载的方式加载类对象!

public class BeanFactory {// 创建文件对象private static Properties env = new Properties();// 利用静态代码块一次性的加载文件static {InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");try {env.load(inputStream);inputStream.close();} catch (IOException e) {e.printStackTrace();}}public static 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;}
}

此时回看代码,耦合基本上就没有了,如果要添加类的话,也只需要更改文件中的类路径就行了

三、为什么使用Spring?

对于类对象,不只是单单的存在一个UserService,回看UserService方法,也是new了一个UserDao对象。肯定也是存在耦合的,这里肯定也要利用工厂类获取

此时在UserService中使用BeanFactory工厂类创建UserDao对象,并且在BeanFactory中创建对应的方法获取UserDao对象

public class BeanFactory {// 创建文件对象private static Properties env = new Properties();// 利用静态代码块一次性的加载文件static {InputStream inputStream =BeanFactory.class.getResourceAsStream("/applicationContext.properties");try {env.load(inputStream);inputStream.close();} catch (IOException e) {e.printStackTrace();}}public static UserDao getUserDao() {UserDao userDao = null;try {Class clazz = Class.forName(env.getProperty("userDao"));userDao = (UserDao) clazz.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return userDao;}public static 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;}
}

此时,问题又出现了,每当需要获取一个对象的时候我都要写一个方法,那这样的代码冗余不是非常高吗!此时就可以使用Object来返回对象解决此问题!

public class BeanFactory {// 创建文件private static Properties env = new Properties();// 利用静态代码块一次性的加载文件static {InputStream inputStream =BeanFactory.class.getResourceAsStream("/applicationContext.properties");try {env.load(inputStream);inputStream.close();} catch (IOException e) {e.printStackTrace();}}// 此时就利用参数获取想要创建的对象public static Object getBean(String key) {Object ret = null;try {Class clazz = Class.forName(env.getProperty(key));ret = clazz.newInstance();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return ret;}//    public static 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;
//    }
//
//    public static UserDao getUserDao() {
//        UserDao userDao = null;
//        try {
//            Class clazz = Class.forName(env.getProperty("userDao"));
//            userDao = (UserDao) clazz.newInstance();
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        }
//        return userDao;
//    }}

对于之前的类对象获取也需要进行相应的处理,强制类型转化即可。

至此,所有的问题都已经解决完毕了!!! 从上面的过程可以发现,解耦的过程还是很复杂的,但是在Spring中已经包含了工厂的设计模式!并不需要我们去手动的写工厂类,我们只需要去使用Spring中的工厂类就可以了。Spring 框架提供了许多功能和特性,可以帮助开发人员快速构建企业应用程序。所以这也就是我们为什么要使用Spring进行项目开发的原因!

这里Spring的本质也就可以总结为:工厂!一个功能强大的工厂!至此Spring的学习正式开始

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

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

相关文章

C语言实现数据结构顺序查找和折半查找代码

文章目录 一、顺序查找二、折半查找 一、顺序查找 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> typedef struct {//查找表的数据结构int *data;//动态数组基址int TableLen;//表长 }SSTable;void InitTable(SSTable *L) {//初始化一个…

云上攻防-云原生篇Docker安全权限环境检测容器逃逸特权模式危险挂载

文章目录 前言1、Docker是干嘛的&#xff1f;2、Docker对于渗透测试影响&#xff1f;3、Docker渗透测试点有那些&#xff1f;4、前渗透-判断在Docker中方式一&#xff1a;查询cgroup信息方式二&#xff1a;检查/.dockerenv文件方式三&#xff1a;检查mount信息方式四&#xff1…

国外互联网巨头常用的项目管理工具揭秘

大型互联网公司有涉及多个团队和利益相关者的复杂项目。为了保持项目的组织性和效率&#xff0c;他们中的许多人依赖于项目管理工具。这些工具有助于跟踪任务&#xff0c;与团队成员沟通&#xff0c;并监控进度。让我们来看看一些大型互联网公司正在使用的项目管理工具。 1、Zo…

【git】git命令行

首先要了解git整个流程的一个分类&#xff1a; workspace&#xff1a;工作区staging area&#xff1a;暂存区/缓存区local repository&#xff1a;版本库或本地仓库remote repository&#xff1a;远程仓库 创建仓库 git clone gitgithub.comxxxxxxxxxxxx//拷贝一份远程仓库 …

TensorFlow入门(十七、神经元的拟合原理)

深度学习的概念源于人工神经网络的研究,神经网络是由多个神经元组成,。一个神经元由以下几个关键知识点组成: ①激活函数 ②损失函数 ③梯度下降 单个神经元的网络模型如图所示 用计算公式表达如下: z为输出的结果,x为输入,w为权重,b为偏置值。z…

十六、 代码校验(3)

本章概要 测试驱动开发 测试驱动 vs 测试优先 日志 日志信息日志等级 测试驱动开发 之所以可以有测试驱动开发&#xff08;TDD&#xff09;这种开发方式&#xff0c;是因为如果你在设计和编写代码时考虑到了测试&#xff0c;那么你不仅可以写出可测试性更好的代码&#xff…

GEE:使用中文做变量和函数名写GEE代码

作者&#xff1a;CSDN _养乐多_ 啊&#xff1f;最近在编写GEE代码的时候&#xff0c;无意中发现 JavaScript 已经能够支持中文字符作为变量名和函数名&#xff0c;这个发现让我感到非常兴奋。这意味着以后在编程过程中&#xff0c;我可以更自由地融入中文元素&#xff0c;不再…

[Python]黑色背景白色块滑动视频

黑色背景白色块滑动视频&#xff0c;单帧效果如下&#xff1a; 配置参数 1920 1080 400 400 300 60 1920x1080.avi import numpy as np import cv2 as cv import os import syswidth 1920 height 1080 rect_szx 400 rect_szy 300 sz_y_init 400 fps 24width int(sys.a…

1.1 向量与线性组合

一、向量的基础知识 两个独立的数字 v 1 v_1 v1​ 和 v 2 v_2 v2​&#xff0c;将它们配对可以产生一个二维向量 v \boldsymbol{v} v&#xff1a; 列向量 v v [ v 1 v 2 ] v 1 v 的第一个分量 v 2 v 的第二个分量 \textbf{列向量}\,\boldsymbol v\kern 10pt\boldsymbol …

Linux 测试端口是否放行

Linux 测试端口是否放行 1、准备2、在 CentOS 7 上放行端口&#xff0c;你可以使用以下方法&#xff1a;4、错误解决&#xff1a;[rootlocalhost backup]# netcat -l -p 11111 netcat: cannot use -p and -l 装了netcat不能用5、能用telnet去测试吗6、效果&#xff1a; 1、准备…

开源在线客服系统源码微信小程序

又来啦&#xff01;今天要给大家分享的是一款在线客服微信小程序源码系统&#xff0c;在外面现在的日常生活中&#xff0c;客服是不可或缺的岗位&#xff0c;下面我们一起来看看这款系统的功能介绍吧。下面是部分的代码截图&#xff1a; 在线客服系统源码微信小程序的功能主要包…

【使用 TensorFlow 2】02/3 使用 Lambda 层创建自定义激活函数

一、说明 TensorFlow 2发布已经接近2年时间&#xff0c;不仅继承了Keras快速上手和易于使用的特性&#xff0c;同时还扩展了原有Keras所不支持的分布式训练的特性。3大设计原则&#xff1a;简化概念&#xff0c;海纳百川&#xff0c;构建生态.这是本系列的第三部分&#xff0c;…

JMeter性能测试,完整入门篇

1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言&#xff0c;JMeter小巧轻便且免费&#xff0c;逐渐成为了主流的性能测试工具&#xff0c;是每个测试人员都必须要掌握的工具之一。 本文为JMeter性能测试完整入门篇&…

Web自动化测试入门 : 前端页面的组成分析详解

目前常见的前端页面是由HTMLcssJavaScript组成。 一、HTML&#xff1a; 作用&#xff1a;定义页面呈现的内容 HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language)HTML 不是一种编程语言&#xff0c;而是一种标记语言 (markup langua…

并发编程——1.java内存图及相关内容

这篇文章&#xff0c;我们来讲一下java的内存图及并发编程的预备内容。 首先&#xff0c;我们来看一下下面的这两段代码&#xff1a; 下面&#xff0c;我们给出上面这两段代码在运行时的内存结构图&#xff0c;如下图所示&#xff1a; 下面&#xff0c;我们来具体的讲解一下。…

day14I102.二叉树的层序遍历

1、102.二叉树的层序遍历 题目链接&#xff1a;https://leetcode.cn/problems/binary-tree-level-order-traversal/ 文章链接&#xff1a;https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#%E7%AE%97%E6%B3%95…

C# AnimeGANv2 人像动漫化

效果 项目 下载 可执行程序exe下载 源码下载 其他 C# 人像卡通化 Onnx photo2cartoon-CSDN博客 C# AnimeGAN 漫画风格迁移 动漫风格迁移 图像卡通化 图像动漫化_天天代码码天天的博客-CSDN博客

最新AI创作系统ChatGPT源码+详细搭建部署教程,支持AI绘画/支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

SpringSecurity + jwt + vue2 实现权限管理 , 前端Cookie.set() 设置jwt token无效问题(已解决)

问题描述 今天也是日常写程序的一天 , 还是那个熟悉的IDEA , 还是那个熟悉的Chrome浏览器 , 还是那个熟悉的网站 , 当我准备登录系统进行登录的时候 , 发现会直接重定向到登录页 , 后端也没有报错 , 前端也没有报错 , 于是我得脸上又多了一张痛苦面具 , 紧接着在前端疯狂debug…

uniapp 使用和引入 thorui

1. npm install thorui-uni 2. "easycom": { "autoscan": true, "custom": { "tui-(.*)": "thorui-uni/lib/thorui/tui-$1/tui-$1.vue" } }, 3.