Java框架(九)--Spring Boot入门(1)

news2024/11/16 11:45:44

SpringBoot 2.x入门简介

学前基础

Maven
Spring
MVC理念

开发环境

Spring Boot官网版本介绍
https://spring.io/projects/spring-boot#learn
在这里插入图片描述
我们点击 Reference Doc. ,再点击Getting Started,就可以看到官网系统环境说明了
在这里插入图片描述
官网系统环境说明
在这里插入图片描述

Spring与SpringBoot

Spring官网
https://spring.io/
在这里插入图片描述
所有的Spring的生态体系所有的框架的底子都依赖于Spring的。
SpringBoot其实是一套简化的Spring技术栈的开发的脚手架。通过SpringBoot的使用,可以把相应组件都可以引入到项目里面来,使得我们更多的精力关注到业务。

Spring Boot核心特点

开箱即用:之前开发SSM系统的时候,想启动系统就配置Tomcat、项目打包到对应的目录等,这些在Spring Boot里都不需要再做了,它是可以非常轻松的被独立创建起来的,直接启动main函数就可以启动起来,因为Tomcat也被内嵌在其中。
约定优于配置:很多项目都有默认配置,Web端口号默认就是8080,像这些配置大家都是约定俗成的,在开发环境直接遵守这个配置就可以了,还方便团队协作。像这样的配置,对于Spring Boot来说就非常良好的约定,只需要遵守,不再需要重复的配置,或者只需少量的配置即可。Spring Boot把这条核心特点运用的淋漓尽致,告别了各种各样的配置,使得Spring Boot非常简单易用和快速上手。

MVC模式

Model 模型层:存取数据的对象,一般来说统称为JavaBean、Entity、POJO类等。它也可以有相应的逻辑的,在数据变化的时候,在控制器Controller 里面的数据变更。本质上可以理解为是一个数据对象,这个数据对象可以是从数据库里面读取出来进行封装,也可以是从前端(H5、安卓、小程序等)传过来的一个对象。
View 视图层:模型要展示的内容,其实也就是可数据化、要可视、要可以被展示的渲染内容。比如早期的jsp , Freemarker ,又或者后面要接触的 Thymeleaf 等等。
Controller 控制层:也可以叫做控制器。控制器是作用于模型和视图之上的,主要控制数据流向模型。并且,在数据变化的时候,也可以去控制里面的内容,控制对象中封装的数据去更新到视图里面。使得视图和模型可以两两分开进行解耦。简而言之,可以在控制器里面去实现业务逻辑,可以接受来自视图层的数据对象,并且加以处理,也可以对数据库读取后的数据处理后,再反馈给视图层。
在这里插入图片描述
MVC模式是一种通用的web开发模式,不管是在以前还是在现在,它一直都是存在的,只不过技术框架在变更,但是它的本质还是不变的。

Struts1/2 + Spring + Hibernate 早期的框架组合SSH
SpringMVC + Spring + MyBatis 后面非常主流的框架SSM
SpringBoot + Spring + MyBatis(JPA/Hibernate) 现在的主流框架

SpringBoot 版本标签

GA:General Availability发布版本,面向大众的,可用的稳定版本,特点为功能完整且非常的稳定,一旦发布后代码内容不会轻易更改。推荐选择这个版本的其中一个。
CURRENT:最新的GA版本。
SNAPSHOT:快照,还不稳定,可能随时会被修改。
PRE:尝鲜版本,或叫预发布版本,提供给开发人员使用,但是不推荐在生产环境中使用。
在这里插入图片描述

通过官网Initializr构建SpringBoot

浏览器访问start.spring.io并按图配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
生成完项目解压并用IDEA打开(依次点击File->open并选择解压好的项目文件即可)
在这里插入图片描述
其中SpringBootLearnApplication为启动类,也是应用程序的入口类,它的位置不可随意改动。
启动类需要放在根包路径下,因为他会默认扫描Contoller和Service以及Mapper等一些相关的组件,扫描完了之后,会放入到spring/springboot的容器中。

通过IDEA构建基于Maven的SpringBoot

打开IDEA依次点击File->new->Project然后按下图配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
使用IDEA生成比官网更简便。

在com.ql.springbootlearn.controller包下创建HelloController.java

package com.ql.springbootlearn.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

//@Controller
@RestController
public class HelloController {
    @RequestMapping("hello")
    //@ResponseBody
    public String hello(){
        return "Hello World~~";
    }
}

其中@RestController注解为在普通的Controller注解基础上有RESTful能力,相当于@Controller与@ResponseBody的结合。

运行启动类,在浏览器访问http://localhost:8080/hello
在这里插入图片描述

@RequestMapping与Postman的使用

除了@RequestMapping还有@GetMapping、@PostMapping、@PutMapping、@DeleteMapping四种遵循了REST规范的请求注解。
一般来说查询使用@GetMapping,对于保存使用@PostMapping,对于修改使用@PutMapping,对于删除使用@DeleteMapping,这是一种强规范。如果使用弱规范,@GetMapping使用与查询,@PostMapping使用与增删改。

除了Get请求,其他请求的测试就无法使用浏览器地址栏测试了,所以推荐使用Postman工具。
我们可以把HelloController的方法请求注解改为PostMapping并重启项目

    @PostMapping("hello")
    public String hello(){
        return "Hello World~~";
    }

再浏览器访问就找不到路由
在这里插入图片描述
可以打开Postman访问请求
在这里插入图片描述

SpringBoot 启动器starter依赖管理

我们打开pom.xml可以看到有个parent的依赖,它是引入了父工程SpringBoot(启动器starter),它里面包含了很多SpringBoot的子工程。在这里插入图片描述
我们可以把鼠标放到spring-boot-starter-parent上,然后按住Ctrl点击打开。
在这里插入图片描述
再按住Ctrl点击spring-boot-dependencies打开。
在这里插入图片描述
所以说spring-boot-starter-parent帮我们定义了自带的一些jar包,在需要的时候直接引用就可以了,而且它们的版本也不需要再写一遍,都已经定义好了,而且都是现阶段最佳最稳定的匹配的版本。当然想要使用其他的版本的话,在pom.xml里重写并指定需要使用的版本即可。

我们以前在开发项目的时候,引入某个框架就会这个框架和他的相关依赖的坐标都引入的pom.xml文件里,并指定各个依赖的版本。当我们使用了SpringBoot的时候,他帮我们做了统一,我们只需要引入这个框架的starter,就会自动的把相关技术栈相关依赖都统一的引入到我们的项目里面来,我们不再需要写这些相关依赖的坐标和版本。这使得我们pom.xml文件看起来精简了很多,提高了我们的可读性,并且他们的冗余度也不会很多。这样实现了我们一站式的开发,我们对jar包的管理方式更加的方便。

SpringBoot官方的starter依赖
在这里插入图片描述

SpringBoot的yml配置文件

在项目src/main/resources目录下创建application.yml文件。

server:
  port: 8090

这个是由官方所提供的SpringBoot核心配置文件。并把HelloController的方法请求注解改为GetMapping。

    @GetMapping("hello")
    public String hello(){
        return "Hello World~~";
    }

我们启动项目,在浏览器访问http://localhost:8090/hello
在这里插入图片描述
配置文件生效。

SpringBoot项目配置文件格式有两种:
properties

environments.dev.url=http://ql.com
environments.dev.name=Developer

yml:分层级,冒号后需要空格

environments:
	dev:
		url: http://ql.com
		name: Developer

每一层有个Tab缩进,大小写敏感,相同的部分只会出现一次。

官方文档上还有很多配置的说明。
在这里插入图片描述

bootstrap.yml配置文件

SpringBoot里有两种配置文件,一个是application.yml,另一个是bootstrap.yml。bootstrap.yml是一种启动级别的,主要用于处理额外的资源配置加载配置信息。

上下文对象: application vs bootstrap
加载优先级: bootstrap > application
常用性: application.yml > bootstrap.yml

application.yml和bootstrap.yml都会用同一个SpringBoot容器环境。bootstrap.yml里面相关的属性是不会被覆盖的。

使用场景
application.yml主要用于springboot项目的配置。
bootstrap.yml 在SpringCloud里有个配置中心,需要加载外部的配置,就需要用到bootstrap.yml。还有加密解密、固定参数等场景也用到bootstrap.yml。

devtools 自动重启实现

打开pom.xml文件,引入devtools组件

		<!--springboot 提供的开发者工具-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>

启动项目,在浏览器访问http://localhost:8090/hello
在这里插入图片描述
我们修改HelloController.java中方法为

@GetMapping("hello")
    public String hello(){
        return "Hello SpringBoot~~";
    }

然后依次点击IDEA菜单栏的Build=>Build Project
在这里插入图片描述
再次刷新浏览器就会自动加载更新的内容。
在这里插入图片描述
devtools 只会Java类代码的修改后能自动编译,如果涉及到资源配置的修改的话就无法自动重启了。
如果是项目已经做大了就不推荐这个组件了。

依赖注入与控制反转的实现

在com.ql.springbootlearn.pojo包下创建Stu.java实体类

package com.ql.springbootlearn.pojo;

public class Stu {
    public String name;
    public Integer age;

    public Stu(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

然后在com.ql.springbootlearn.config包下创建SpringBookConfig.java配置类

package com.ql.springbootlearn.config;

import com.ql.springbootlearn.pojo.Stu;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SpringBookConfig {

    @Bean
    public Stu stu(){
        return new Stu("Jack", 20);
    }
}

其中@Configuration注解为了说明当前类为配置类,加上这个注解后会被容器扫描到。该注解和@Controller、@Service、@Repository、@Component等注解同等作用,只是根据场景以及类的业务选择使用即可。

然后在HelloController.java里注入Stu类

    @Autowired
    private Stu stu;

    @GetMapping("getStu")
    public Object getStu(){
        return stu;
    }

运行项目,浏览器访问http://localhost:8090/getStu
在这里插入图片描述

SpringBoot自定义属性资源配置

在src/main/resources目录下创建MyConfig.properties属性文件

user.username=Tom
user.age=21
user.sex=

然后在com.ql.springbootlearn.pojo包下创建MyConfig.java类

package com.ql.springbootlearn.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "user")
@PropertySource(value = "classpath:MyConfig.properties", encoding = "utf-8")
public class MyConfig {
    public String username;
    public Integer age;
    public String sex;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

其中@ConfigurationProperties必须配置属性前缀prefix = “user”。另外引入这个注解后会在编辑器上方报一个Spring Boot Configuration Annotation Processor not found in classpath
我们只需要在pom.xml文件引入一个配置处理器依赖即可

		<!--SpringBoot配置处理器-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
		</dependency>

然后在HelloController.java注入该配置类

    @Autowired
    private MyConfig myConfig;
    
    @GetMapping("getMyConfig")
    public Object getMyConfig(){
        return myConfig;
    }

运行项目,浏览器访问http://localhost:8090/getMyConfig
在这里插入图片描述
注意:出现中文乱码的,设置下IDEA编码
在这里插入图片描述

在yml中实现自定义配置与表达式

打开application.yml文件添加以下内容

server:
  port: 8090
  
app:
  name:
    xxx:
      yyy:
        zzz: abc

self:
  custom:
    sdkSecrect: abc123
    host: https://www.ql.com
    port: ${server.port}

然后在HelloController.java中引用

    @Value("${self.custom.sdkSecrect}")
    private String sdkSecrect;
    @Value("${self.custom.host}")
    private String host;
    @Value("${self.custom.port}")
    private String port;
    @Value("${app.name.xxx.yyy.zzz}")
    private String xyz;

    @GetMapping("getYmlConfig")
    public Object getYmlConfig(){
        return host+":"+port+"/"+xyz+"/"+sdkSecrect;
    }

运行项目,浏览器访问http://localhost:8090/getYmlConfig
在这里插入图片描述

实现自定义的启动logo

在src/main/resources/static目录引入图片
在这里插入图片描述
然后在application.yml中添加

spring:
  banner:
    image:
      location: classpath:static/banner.png
      pixelmode: text

maven clean项目后,重新启动项目
在这里插入图片描述
控制台就看到设置的logo了

图片转换成文本的网站
https://degraeve.com/img2txt.php
在这里插入图片描述
然后输入图片资源地址,点击ASCIIFY生成
在这里插入图片描述
就可以生成文本,保存下来。
在这里插入图片描述
然后修改application.yml

spring:
  banner:
    location: classpath:static/banner.txt
#    image:
#      location: classpath:static/banner.png
#      pixelmode: block

maven clean项目后,重新启动项目
在这里插入图片描述
当然,还是这个经典。
在这里插入图片描述

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

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

相关文章

Nginx安装和Nginx配置虚拟主机

Nginx安装 源码包获取地址&#xff1a;http://nginx.org/download/ RPM包获取地址&#xff1a;http://nginx.org/packages/centos/7Server/x86_64/RPMS/ RPM安装 这里选择的RPM包是 nginx-1.22.0-1.el7.ngx.x86_64.rpm [rootlocalhost ~]# yum install nginx-1.22.0-1.el7.…

RabbitMQ:概念和安装,简单模式,工作,发布确认,交换机,死信队列,延迟队列,发布确认高级,其它知识,集群

1. 消息队列 1.0 课程介绍 1.1.MQ 的相关概念 1.1.1.什么是MQ MQ(message queue&#xff1a;消息队列)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是message 而已&#xff0c;还是一种跨进程的通信机制…

k8s集群部署nacos,采用的是 emptyDir 临时目录挂载

官方参考地址&#xff1a;https://nacos.io/zh-cn/docs/use-nacos-with-kubernetes.html 说明&#xff1a; 1、官网采用的nfs持久化部署 我将nacos持久化改成 emptyDir 临时目录挂载&#xff0c;同时又能满足自行调节nacos集群实例数。 2. emptyDir 临时目录挂载的nacos.ya…

记录 Vue3 + Ts 类型使用

阅读时长: 10 分钟 本文内容&#xff1a;记录在 Vue3 中使用 ts 时的各种写法. 类型大小写 vue3 ts 项目中&#xff0c;类型一会儿大写一会儿小写。 怎么区分与基础类型使用? String、string、Number、number、Boolean、boolean … 在 js 中&#xff0c; 以 string 与 String…

TS协议之PAT(节目关联表)

1. 概要 PAT&#xff1a;节目关联表&#xff0c;与PMT成对出现&#xff0c;包含所有的频道编号&#xff1b;是解析ts数据的起点。 PAT数据结构如下&#xff1a; PAT数据结构 字段分析&#xff1a; TS头&#xff1a;参考TS协议之PES&#xff08;数据包&#xff09;&#xf…

Cpp学习——模板

模板&#xff1f; 目录 模板&#xff1f; 1.介绍 2.函数模板的使用 3.函数模板的强制转换or显式调用 四,模板的分类 1.介绍 在Cpp3.0中&#xff0c;祖师爷便引入了模板的概念。这是一个重大的变革&#xff0c;为后来的Cpp标准化打下了铺垫。也正是因为有了模板&#xff0…

centos命令

1 使用 ps 命令查看 Redis 进程&#xff1a; ps -ef | grep redis如果 Redis 正在运行&#xff0c;你将会看到类似如下的输出&#xff1a; redis 1234 1 0 Jul28 ? 00:00:00 /usr/bin/redis-server 127.0.0.1:6379如果 Redis 没有运行&#xff0c;你将不会看…

【第一阶段】kotlin的when表达式

1.Java 的if /when是语句 kotlin的if/when是表达式&#xff0c;表达式是有返回值的 java中void是个关键字&#xff0c;Unit在kotlin中是个类 2.当使用when语句的时候必须有一个不满足的值即else: fun main() {var week:Int5val info when(week){1->"今天是星期一"…

0803|IO进程线程day6 【线程】概念+相关函数

一、线程的概念 1.1 什么是线程&#xff1f; 1&#xff09;线程是一个进程并发执行多种任务的机制。 并发&#xff1a; 单核cpu多个任务同时运行。cpu以ms级别的速度进程进程调度&#xff0c;切换进程和线程。 串行、并发、并行&#xff1a; 并行&#xff1a;多个任务在多核C…

数据结构—树和二叉树

5.树和二叉树 5.1树和二叉树的定义 树形结构&#xff08;非线性结构&#xff09;&#xff1a;结点之间有分支&#xff0c;具有层次关系。 5.1.1树的定义 树&#xff08;Tree&#xff09;是n&#xff08;n≥0&#xff09;个结点的有限集。 若n0&#xff0c;称为空树&#x…

链表的总体涵盖以及无哨兵位单链表实现——【数据结构】

&#x1f60a;W…Y&#xff1a;个人主页 在学习之前看一下美丽的夕阳&#xff0c;也是很不错的。 如果觉得博主的美景不错&#xff0c;博客也不错的话&#xff0c;关注一下博主吧&#x1f495; 在上一期中&#xff0c;我们说完了顺序表&#xff0c;并且提出顺序表中的问题 1. 中…

C++ ------ 类和对象的深究

文章目录 构造函数初始化列表概念特性 explicit关键字 static成员概念特点 友元友元函数友元类概念特性 内部类概念特点 匿名对象拷贝对象时的一些编译器优化 构造函数 我们来看下面的代码&#xff1a; #include <iostream> using namespace std;class Date { public:D…

三周目创作纪念日

机缘收获日常成就憧憬 机缘 最初成为创作者的初心 实战项目中的经验分享日常学习过程中的记录通过文章进行技术交流 收获 在创作的过程中都有哪些收获 获得了很多粉丝的关注获得了很多正向的反馈&#xff0c;如赞、评论、阅读量等认识了很多志同道合的领域同行 日常 当前创…

【零基础学Rust | 基础系列 | Hello, Rust】编写并运行第一个Rust程序

文章目录 前言一&#xff0c;创建项目二&#xff0c;两种编译方式1. 使用rustc编译器编译2. 使用Cargo编译 总结 前言 在开始学习任何一门新的编程语言时&#xff0c;都会从编写一个简单的 “Hello, World!” 程序开始。在这一章节中&#xff0c;将会介绍如何在Rust中编写并运…

CSS学习记录(基础笔记)

CSS简介: CSS 指的是层叠样式表* (Cascading Style Sheets)&#xff0c;主要用于设置HTML页面的文字内容&#xff08;字体、大小、对齐方式&#xff09;&#xff0c;图片的外形&#xff08;边框&#xff09; CSS 描述了如何在屏幕、纸张或其他媒体上显示 HTML 元素 CSS 节省…

JVM面试题--实践

目录 JVM 调优的参数可以在哪里设置参数值 war包部署在tomcat中设置 jar包部署在启动参数设置 JVM 调优的参数都有哪些&#xff1f; 设置堆空间大小 虚拟机栈的设置 年轻代中Eden区和两个Survivor区的大小比例 年轻代晋升老年代阈值 设置垃圾回收收集器 JVM 调优的工…

《高质量数字化转型产品及服务全景图(2023上半年度)》希尔贝壳成功入选

2023年7月27日&#xff0c;由中国信息通信研究院泰尔终端实验室主办的2023数字生态发展大会暨中国信通院“铸基计划”年中会议在北京成功召开。在本次会上&#xff0c;中国信通院重磅发布《高质量数字化转型产品及服务全景图&#xff08;2023上半年&#xff09;》&#xff0c;希…

MySQL索引1——基本概念与索引结构(B树、R树、Hash等)

目录 索引(INDEX)基本概念 索引结构分类 BTree树索引结构 Hash索引结构 Full-Text索引 R-Tree索引 索引(INDEX)基本概念 什么是索引 索引是帮助MySQL高效获取数据的有序数据结构 为数据库表中的某些列创建索引&#xff0c;就是对数据库表中某些列的值通过不同的数据结…

MVC配置原理

如果你想保存springboot的mvc配置并且还想自己添加自己的配置就用这个。 视图解析器原理&#xff0c;它会从IOC容器里获取配置好视图解析器的配置类里的视图解析器集合&#xff0c; 然后遍历集合&#xff0c;生成一个一个的视图对象&#xff0c;放入候选 视图里&#xff0c;…

【华秋干货铺】PCB布线技巧升级:高速信号篇

如下表所示&#xff0c;接口信号能工作在8Gbps及以上速率&#xff0c;由于速率很高&#xff0c;PCB布线设计要求会更严格&#xff0c;在前几篇关于PCB布线内容的基础上&#xff0c;还需要根据本篇内容的要求来进行PCB布线设计。 高速信号布线时尽量少打孔换层&#xff0c;换层优…