Spring全家桶还是傻傻分不清楚?(Ⅱ)

接着上篇对Spring/SpringFramework的讲解,我们继续来看Spring全家桶中另一位重量级的成员——SpringBoot,在Java后端开发的招聘要求中基本上成了必备技能,那他的魅力究竟在哪呢?已经有了Spring,为什么还要SpringBoot呢?我们一起来看一下Spring的优点和不足,从而引出今天的主角——SpringBoot

SpringFramework解决了什么问题?

Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的EnterpriseJavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。 

1.使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑 2.可以提供众多服务,事务管理,WS等。 3.AOP的很好支持,方便面向切面编程。 4.对主流的框架提供了很好的集成支持,如Hibernate,Struts2,JPA等 5.Spring DI机制降低了业务对象替换的复杂性。 6.Spring属于低侵入,代码污染极低。 7.Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部

什么是低入侵、低污染率呢?

在讨论框架设计时,"低侵入"(Low Intrusion)意味着框架对应用程序代码的影响最小,开发人员无需为满足框架要求而大幅调整原有设计或逻辑。Spring 框架被认为是低侵入性的,这意味着它在不改变应用程序代码结构的情况下,提供了强大的功能支持。

以下是对 "Spring属于低侵入,代码污染极低" 这句话的理解:

  1. 低侵入性

    • Spring 不强制开发人员遵循某种特定的编码风格或设计模式。与一些框架相比,Spring 允许开发者以几乎不改变原有业务逻辑的方式将其集成到项目中。

    • 例如,Spring 的依赖注入(Dependency Injection)和面向切面编程(AOP)特性可以通过简单的配置或注解来实现,而不会对代码的业务逻辑产生重大影响。

  2. 代码污染极低

    • 代码污染指的是为了适应某个框架而在应用程序中引入大量与框架相关的代码。这些代码可能包括接口、抽象类、注解或其他特定框架的元素。

    • Spring 的设计目标之一是让框架尽量不侵入业务代码,使得代码保持简洁和清晰。开发人员可以专注于业务逻辑,而不是在代码中到处引入框架相关的实现。

    • 例如,在使用 Spring 的时候,大多数业务逻辑类不需要依赖 Spring 特定的类或接口,只需通过注解(如 @Autowired@Component)或配置文件来完成与框架的集成。

SpringFramework没有解决了什么问题?

虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。

所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。

除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

1.jsp中要写很多代码、控制器过于灵活,缺少一个公用控制器 2.Spring不支持分布式,这也是EJB仍然在用的原因之一。

为什么使用SpringBoot

简化开发:Spring Boot通过提供一系列的开箱即用的组件和自动配置,简化了项目的配置和开发过程,开发人员可以更专注于业务逻辑的实现,而不需要花费过多时间在繁琐的配置上。

快速启动:Spring Boot提供了快速的应用程序启动方式,可通过内嵌的Tomcat、Jetty或Undertow等容器快速启动应用程序,无需额外的部署步骤,方便快捷。

自动化配置:Spring Boot通过自动配置功能,根据项目中的依赖关系和约定俗成的规则来配置应用程序,减少了配置的复杂性,使开发者更容易实现应用的最佳实践。

怎么理解SpringBoot中的约定大于配置

理解 Spring Boot中的"约定大于配置"原则,可以从以下几个方面来解释:

自动化配置:Spring Boot提供了大量的自动化配置,通过分析项目的依赖和环境,自动配置应用程序的行为。开发者无需显式地配置每个细节,大部分常用的配置都已经预设好了。例如,Spring Boot可以根据项目中引入的数据库依赖自动配置数据源。 •默认配置:Spring Boot在没有明确配置的情况下,会使用合理的默认值来初始化应用程序。这种默认行为使得开发者可以专注于核心业务逻辑,而无需关心每个细节的配置。 •约定优于配置:Spring Boot遵循了约定优于配置的设计哲学,即通过约定好的方式来提供默认行为,减少开发者需要做出的决策。例如,约定了项目结构、Bean命名规范等,使得开发者可以更快地上手并保持团队间的一致性。

Spring Boot的"约定大于配置"原则是一种设计理念,通过减少配置和提供合理的默认值,使得开发者可以更快速地构建和部署应用程序,同时降低了入门门槛和维护成本。

Spring Boot通过「自动化配置」和「起步依赖」实现了约定大于配置的特性。

自动化配置:Spring Boot根据项目的依赖和环境自动配置应用程序,无需手动配置大量的XML或Java配置文件。例如,如果项目引入了Spring Web MVC依赖,Spring Boot会自动配置一个基本的Web应用程序上下文。 •起步依赖:Spring Boot提供了一系列起步依赖,这些依赖包含了常用的框架和功能,可以帮助开发者快速搭建项目。通过引入适合项目需求的起步依赖,开发者可以快速搭建项目。

SpringBoot的项目结构是怎么样的?

根据业务架构实践,结合业界分层规范与流行技术框架分析,推荐分层结构如图所示,默认上层依赖于下层,箭头关系表示可直接依赖,如:开放 API 层可以依赖于 Web 层(Controller 层),也可以直接依赖于 Service 层,依此类推:

⚫ 开放 API 层:可直接封装 Service 接口暴露成 RPC 接口;通过 Web 封装成 http 接口;网关控制层等。

⚫ 终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,JS 渲染,JSP 渲染,移动端展示等。

⚫ Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。

⚫ Service 层:相对具体的业务逻辑服务层。

⚫ Manager 层:通用业务处理层,它有如下特征

1)对第三方平台封装的层,预处理返回结果及转化异常信息,适配上层接口。

2)对 Service 层通用能力的下沉,如缓存方案、中间件通用处理。

3)与 DAO 层交互,对多个 DAO 的组合复用。

⚫ DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase、OceanBase等进行数据交互。

⚫ 第三方服务:包括其它部门 RPC 服务接口,基础平台,其它公司的 HTTP 接口,如淘宝开放平台、支付宝付款服务、

高德地图服务等。

⚫ 外部数据接口:外部(应用)数据存储服务提供的接口,多见于数据迁移场景中。

SpringBootWeb的请求响应

基于SpringBoot的方式开发一个web应用,浏览器发起请求 /hello 后 ,给浏览器返回字符串 “Hello World ~”。

我们在浏览器发起请求,请求了我们的后端web服务器(也就是内置的Tomcat)。而我们在开发web程序时呢,定义了一个控制器类Controller,请求会被部署在Tomcat中的Controller接收,然后Controller再给浏览器一个响应,响应一个字符串 “Hello World”。 而在请求响应的过程中是遵循HTTP协议的。

但是,在Tomcat这类Web服务器中,是不识别我们自己定义的Controller的。但是我们前面讲到过Tomcat是一个Servlet容器,是支持Serlvet规范的,所以呢,在tomcat中是可以识别 Servlet程序的。 那我们所编写的XxxController 是如何处理请求的,又与Servlet之间有什么联系呢?

Servlet是什么?

在Java中,Servlet 是一种用于扩展服务器功能的 Java 类。它的主要作用是处理客户端请求并生成响应,通常用于 Web 应用程序中。Servlet 是 Java EE(Enterprise Edition)规范的一部分,并且是 Java Web 开发的重要组件。

一个 Servlet 可以执行以下任务:

  1. 处理请求:从客户端(如浏览器)接收请求并解析请求数据。

  2. 生成响应:根据请求的内容生成适当的响应,然后将其发送回客户端。

  3. 维护会话:在处理多个请求时,可以维护用户会话信息,以便于跟踪用户的状态。

Servlet 类通常需要继承 HttpServlet 类,并重写其 doGet()doPost() 方法,以处理 GET 或 POST 请求。例如:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
​
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html");
        
        // 写入响应数据
        response.getWriter().println("<h1>Hello, World!</h1>");
    }
}

在这个示例中,doGet() 方法处理 GET 请求,并返回一个简单的 HTML 响应。

要使 Servlet 生效,你需要将其配置到你的 Web 应用程序中,这通常通过 web.xml 文件或注解来完成。

在SpringBoot进行web程序开发时,内置了一个核心的Servlet程序DispatcherServlet,称之为 核心控制器。 DispatcherServlet 负责接收页面发送的请求,然后根据执行的规则,将请求再转发给后面的请求处理器Controller,请求处理器处理完请求之后,最终再由DispatcherServlet给浏览器响应数据。

那将来浏览器发送请求,会携带请求数据,包括:请求行、请求头;请求到达tomcat之后,tomcat会负责解析这些请求数据,然后呢将解析后的请求数据会传递给Servlet程序的HttpServletRequest对象,那也就意味着 HttpServletRequest 对象就可以获取到请求数据。 而Tomcat,还给Servlet程序传递了一个参HttpServletResponse,通过这个对象,我们就可以给浏览器设置响应数据 。

那上述所描述的这种浏览器/服务器的架构模式呢,我们称之为:BS架构

BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。

SpringBoot接口 - 如何统一接口封装

RESTful API接口

  • 什么是 REST

Representational State Transfer,翻译是“表现层状态转化”。可以总结为一句话:REST 是所有 Web 应用都应该遵守的架构设计指导原则

面向资源是 REST 最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST 要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。

  • 什么是 RESTful API

符合 REST 设计标准的 API,即 RESTful API。REST 架构设计,遵循的各项标准和准则,就是 HTTP 协议的表现,换句话说,HTTP 协议就是属于 REST 架构的设计模式。比如,无状态,请求-响应。

为什么要统一封装接口

现在大多数项目采用前后分离的模式进行开发,统一返回方便前端进行开发和封装,以及出现时给出响应编码和信息。

以查询某个用户接口而言,如果没有封装, 返回结果如下

{
  "userId": 1,
  "userName": "赵一"
}

如果封装了,返回正常的结果如下:

{
  "timestamp": 11111111111,
  "status": 200,
  "message": "success",
  "data": {
    "userId": 1,
    "userName": "赵一"
  }
}

异常返回结果如下:

{
  "timestamp": 11111111111,
  "status": 10001,
  "message": "User not exist",
  "data": null
}

JSON是什么

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)

  • JSON 是轻量级的文本数据交换格式

  • JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。

  • JSON 具有自我描述性,更易理解

结构与类型

  • 只有两种结构:对象内的键值对集合结构数组,对象用{}表示、内部是”key”:”value”,数组用[]表示,不同值用逗号分开

  • 基本数值有7个: false / null / true / object / array / number / string

  • 再加上结构可以嵌套,进而可以用来表达复杂的数据

一个简单实例

{
   "Image": {
       "Width":  800,
       "Height": 600,
       "Title":  "View from 15th Floor",
       "Thumbnail": {
           "Url":    "http://www.example.com/image/481989943",
           "Height": 125,
           "Width":  "100"
       },
       "IDs": [116, 943, 234, 38793]
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值