Spring Boot框架基础

文章目录

  • 1 Spring Boot概述
  • 2 Spring Boot入门
    • 2.1 项目搭建
    • 2.2 入门程序
  • 3 数据请求与响应
    • 3.1 数据请求
    • 3.2 数据响应
  • 4 分层解耦
    • 4.1 三层架构
    • 4.2 控制反转
    • 4.3 依赖注入
  • 5 参考资料


1 Spring Boot概述

Spring是Java EE编程领域的一个轻量级开源框架,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。

Spring发展到今天已经形成一种生态圈,其中最基础、最核心的是 Spring Framework。但直接基于SpringFramework进行开发存在配置繁琐、入门难度大等问题。而Spring Boot可以帮助我们非常快速的构建应用程序、简化开发、提高效率。

官网:https://spring.io/


2 Spring Boot入门

2.1 项目搭建

在IDEA中选择[文件]→[新建]→[项目],选择生成器中的Spring Boot,设置相关的名称、位置、语言、类型、组、工件等信息,指定所需要的依赖项,联网完成创建。

在这里插入图片描述

在这里插入图片描述

2.2 入门程序

com.example包下创建子包controller,在子包内创建和定义请求处理类HelloController

package com.example.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("Hello World~");
        return "Hello World~";
    }
}

运行Spring Boot自动生成的启动类SpringbootWebQuickstartApplication,在浏览器中输入http://localhost:8080/hello运行测试。

在这里插入图片描述

@RestController注解:包括@Controller和@ResponseBody两个注解。

  1. @Controller注解:标识一个Java类为控制器,负责接收请求、处理请求,并返回响应。

  2. @ResponseBody注解:将方法返回值直接响应给浏览器,如果返回值类型是实体对象/集合,将会转换为JSON格式后在响应给浏览器。


3 数据请求与响应

3.1 数据请求

  1. 简单参数:对原始的API进行了封装,接收参数的形式更加简单。

    @RestController
    public class RequestController {
        @RequestMapping("/simpleParam")
        public String simpleParam(String name, Integer age ){
            System.out.println(name+":"+age);
            return "OK";
        }
    }
    
  2. 实体参数:将请求参数封装到一个实体类对象中,保证请求参数名与实体类的属性名相同,按照对象层次结构关系即可接收嵌套实体类属性参数。

    @RestController
    public class RequestController {
        @RequestMapping("/pojoParam")
        public String simplePojo(User user){
            System.out.println(user);
            return "OK";
        }
    }
    
  3. 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型形参即可接收参数。

    @RestController
    public class RequestController {
        @RequestMapping("/arrayParam")
        public String arrayParam(String[] hobby){
            System.out.println(Arrays.toString(hobby));
            return "OK";
        }
    }
    
  4. 集合参数:请求参数名与形参集合对象名相同且请求参数为多个,使用@RequestParam绑定参数关系。

    @RestController
    public class RequestController {
        @RequestMapping("/listParam")
        public String listParam(@RequestParam List<String> hobby){
            System.out.println(hobby);
            return "OK";
        }
    }
    
  5. 日期参数:通过@DateTimeFormat注解,以及其pattern属性来设置日期的格式。

    @RestController
    public class RequestController {
        @RequestMapping("/dateParam")
        public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){
            System.out.println(updateTime);
            return "OK";
        }
    }
    
  6. JSON参数:JSON是开发中最常用的前后端数据交互方式,JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody注解将JSON数据映射到形参的实体类对象中。

    @RestController
    public class RequestController {
        @RequestMapping("/jsonParam")
        public String jsonParam(@RequestBody User user){
            System.out.println(user);
            return "OK";
        }
    }
    
  7. 路径参数:直接在请求的URL中传递参数。

    @RestController
    public class RequestController {
        @RequestMapping("/path/{id}")
        public String pathParam(@PathVariable Integer id){
            System.out.println(id);
            return "OK";
        }
    }
    

3.2 数据响应

统一响应结果使用类来描述,在这个结果中包含响应状态码(当前请求是成功或失败)、状态码信息(给页面的提示信息)、返回的数据(给前端响应的数据)。

public class Result {
    private Integer code;//响应码
    private String msg;  //响应码
    private Object data; //响应数据

    public Result() { }
    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    ...

    //查询 成功响应示例
    public static Result success(Object data){
        return new Result(1,"success",data);
    }
}

4 分层解耦

4.1 三层架构

基于三层架构的程序执行流程:

在这里插入图片描述

  1. 前端发起的请求,由Controller层接收(Controller响应数据给前端)

  2. Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)

  3. Serivce层调用Dao层(逻辑处理过程中需要用到的一些数据要从Dao层获取)

  4. Dao层操作文件中的数据(Dao拿到的数据会返回给Service层)

在软件设计中,我们要做到“高内聚、低耦合”,不直接new一个不同层的新对象,而是提供一个容器,容器中存储一些对象,controller程序从容器中获取Service层需要调用的类型的对象。

4.2 控制反转

控制反转(Inversion Of Control,简称IOC):对象的创建控制权由程序自身转移到外部容器,对象的创建权由程序员主动创建转移到由容器创建、管理对象(bean对象),这个容器称为IOC容器或Spring容器。

Spring框架为了更好的标识开发中bean对象的归属,又提供了@Component的衍生注解。

  1. @Controller :标注在控制层类上

  2. @Service:标注在业务层类上

  3. @Repository:标注在数据访问层类上。

在IOC容器中,每一个Bean都有一个属于自己的名字,可以通过注解的value属性指定bean的名字。如果没有指定,默认为类名首字母小写。

在开发过程中,推荐将controller,service,dao等都放在引导类所在包的子包下,确保定义的bean会被自动的扫描到。

4.3 依赖注入

依赖注入(Dependency Injection,简称DI):容器为应用程序提供运行时所依赖的资源,程序运行时需要某个资源,此时容器就为其提供这个资源。

@Autowired注解:按照类型进行自动装配,去IOC容器中找某个类型的对象,然后完成注入操作。

为了解决IOC容器中存在多个相同类型的bean对象而报错的问题,可以选择使用@Primary注解(在类前添加确定默认的实现)、@Qualifier(配合@Autowired指定当前要注入的bean对象)、@Resource(通过name属性指定要注入的bean的名称)。

@Autowird 与 @Resource的区别

  1. @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解

  2. @Autowired 默认是按照类型注入,而@Resource是按照名称注入


5 参考资料

黑马程序员JavaWeb开发教程-bilibili

Springboot入门到精通(超详细文档)_springboot文档-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI日报|文生语音大模型国内外均有突破,Pika完成6亿新融资,视频大模型也不远了!

文章推荐 AI搜索哪家强&#xff1f;16款产品实战测评&#xff0c;效率飙升秘籍&#xff01; AI日报&#xff5c;智谱AI再降价&#xff0c;同时开源9B系列模型&#xff1b;国内外气象大模型竞逐升级 字节推出文本到语音模型家族Seed-TTS&#xff1a;擅长情感表达&#xff0c;…

前端 JS 经典:打印对象的 bug

1. 问题 相信这个 console 打印语句的 bug&#xff0c;其实小伙伴们是遇到过的&#xff0c;就是你有一个对象&#xff0c;通过 console&#xff0c;打印一次&#xff0c;然后经过一些处理&#xff0c;再通过 console 打印&#xff0c;发现两次打印的结果是一样的&#xff0c;第…

定个小目标之每天刷LeetCode热题(12)

这是一道简单题&#xff0c;使用位运算中的异或运算即可&#xff0c;异或运算有以下性质&#xff1a; 1、任何数异或 0 结果仍然是原来的数&#xff0c;即 a⊕0a 2、任何数和其自身做异或运算&#xff0c;结果是 0 所以我们只需要让数组里的所有元素进行异或运算得到的结果就…

30、matlab现代滤波:维纳滤波/LMS算法滤波/小波变换滤波

1、信号1和信号2的维纳滤波 实现代码 N 2000; %采样点数 Fs 2000; %采样频率 t 0:1 / Fs:1 - 1 / Fs; %时间序列 Signal1 sin(2*pi*20* t) sin(2*pi*40* t) sin(2*pi*60* t); Signal2[2*ones(1,50),zeros(1,50),-1*ones(1,100),zeros(1,50),-2*ones(1,50),zeros(1,50),1…

超详细的java Comparable,Comparator接口解析

前言 Hello大家好呀&#xff0c;在java中我们常常涉及到对象的比较&#xff0c;不同于基本数据类型&#xff0c;对于我们的自定义对象&#xff0c;需要我们自己去建立比较标准&#xff0c;例如我们自定义一个People类&#xff0c;这个类有name和age两个属性&#xff0c;那么问…

Day49 动态规划part08

LC139单词拆分(未掌握) 未掌握分析&#xff1a;将字符串s中的各个字符看成是背包&#xff0c;思考成了多重背包问题单词就是物品&#xff0c;字符串s就是背包&#xff0c;单词能否组成字符串s&#xff0c;就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词&#xf…

RabbitMQ--Hello World(基础详解)

文章目录 先决条件RabbitMQ 初识RabbitMQ--Hello World发送接收 更多相关内容可查看 先决条件 本教程假定 RabbitMQ 已安装并在标准端口 &#xff08;5672&#xff09; 上运行。如果你 使用不同的主机、端口或凭据&#xff0c;连接设置将需要 调整。如未安装可查看Windows下载…

C++多线程同步总结

C多线程同步总结 关于C多线程同步 一、C11规范下的线程库 1、C11 线程库的基本用法&#xff1a;创建线程、分离线程 #include<iostream> #include<thread> #include<windows.h> using namespace std; void threadProc() {cout<<"this is in t…

Oracle EBS AP发票验证-计税期间出现意外错误解决方法

系统版本 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状: **打开发票题头或发票行“税详细信息”**错误提示如下: 由于以下原因而无法针对"税"窗口中所做的修改更新 Oraclee Payables信息: 尚未为税率或帐户来源税率设置可退回税/应纳税额帐户。请…

用 Notepad++ 写 Java 程序

安装包 百度网盘 提取码&#xff1a;6666 安装步骤 双击安装包开始安装。 安装完成&#xff1a; 配置编码 用 NotePad 写 Java 程序时&#xff0c;需要设置编码。 在 设置&#xff0c;首选项&#xff0c;新建 中进行设置&#xff0c;可以对每一个新建的文件起作用。 Note…

29网课交单平台 epay.php SQL注入漏洞复现

0x01 产品简介 29网课交单平台是一个专注于在线教育和知识付费领域的交单平台。该平台基于PHP开发,通过全开源修复和优化,为用户提供了高效、稳定、安全的在线学习和交易环境。作为知识付费系统的重要组成部分,充分利用了互联网的优势,为用户提供了便捷的支付方式、高效的…

CAD二次开发(8)-探索实现不重启CAD进行热部署代码

最近在研究CAD二次开发过程中&#xff0c;调试代码的过程中&#xff0c;需要频繁地重启CAD&#xff0c;非常浪费我们的开发时间&#xff0c;所以我就一直在想&#xff0c;怎么可以实现在不每次重启代码和CAD的情况下&#xff0c;实现代码的热部署效果。 我找到的方式&#xff…

【Linux】进程2——管理概念,进程概念

1.什么是管理&#xff1f; 那在还没有学习进程之前&#xff0c;就问大家&#xff0c;操作系统是怎么管理进行进程管理的呢&#xff1f; 很简单&#xff0c;先把进程描述起来&#xff0c;再把进程组织起来&#xff01; 我们拿大学为例子 最典型的管理者——校长最典型的被管理…

java线程变量共享

在Java中&#xff0c;线程变量共享可以通过几种方式实现&#xff1a; 1.实例变量&#xff1a;如果一个实例变量被多个线程共享&#xff0c;你需要确保适当的同步&#xff0c;以避免竞态条件。你可以使用synchronized关键字或者Lock接口来保护共享变量。 2.静态变量&#xff1a;…

【vuex小试牛刀】

了解vuex核心概念请移步 https://vuex.vuejs.org/zh/ # 一、初始vuex # 1.1 vuex是什么 就是把需要共享的变量全部存储在一个对象里面&#xff0c;然后将这个对象放在顶层组件中供其他组件使用 父子组件通信时&#xff0c;我们通常会采用 props emit 这种方式。但当通信双方不…

高考志愿填报有哪些技巧和方法

一年一度高考季&#xff0c;又高考志愿填报的时侯了。高考志愿填报的时侯&#xff0c;需要考虑的因素比较多&#xff0c;有的同学觉是离家越远越好&#xff0c;要放飞自我&#xff0c;家长再也管不了我了。有的同学觉得专业比学校牌子重要&#xff0c;只要报个好专业&#xff0…

ros2笔记

Ros2 hello world ccreate packagehelloworld.cpp hello world pythonhelloworld.py file explainros2 cmdcreatebuildfindruninstall interfacesmsg filesrv fileaction file Topic hello world c mkdir -p {your workspace name}/src cd {your workspace name} #进入工作空间…

linux 服务器上离线安装 node nvm

因为是离线环境 如果你是可以访问外网的 下面内容仅供参考 也可以继续按步骤来 node 安装路径 Node.js — Download Node.js nvm 安装路径 Tags nvm-sh/nvm GitHub 后来发现 nvm安装后 nvm use 版本号 报错 让我去nvm install 版本 我是内网环境 install不了 下面 你要 把安…

Java——面向对象进阶(一)

前言 面向对象进阶(一)&#xff1a;static&#xff0c;继承&#xff0c;this和super关键字 文章目录 一、static1.1 静态变量1.2 静态方法1.3 静态变量和静态方法在内存中 二、继承2.1 概念2.2 继承的特点和能继承什么2.3 继承中的重写2.4 this和super关键字 一、static 在 Jav…

Isaac Lab CartPole实验(摄像头版本)

Isaac Lab安装可以看这个教程&#xff1a;http://t.csdnimg.cn/SN7duhttp://t.csdnimg.cn/SN7du 1. 问题定义与建模 问题描述&#xff1a;CartPole问题是一个经典的强化学习问题&#xff0c;cartpole 由 cart和pole构成&#xff0c;其中一个小车&#xff08;Cart&#xff09;上…