Java微服务架构之Spring Boot —上篇

embedded/2024/10/18 10:25:45/

SpringBoot 概述

SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。2014年4月,Spring Boot1.0.0发布。Spring的顶级项目之一(https://spring.io)。

Spring的缺点:

(配置繁琐)

虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但它要求的回报也不少。
(2)依赖繁琐
项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

Springboot功能:

1)自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。
2)起步依赖:依赖传递
起步依赖本质上是一个Maven项目对象模型(ProjectObjectModel,POM),定义了对其他库的传递依赖这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。

3)辅助功能
提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等

Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用Spring 的方式。

SpringBoot 快速入门

需求:搭建SpringBoot工程,定义HelloController.hello()方法,返回”HeloSpringBoot!”

案例:实现步骤 :创建Maven项目、导入SpringBoot起步依赖、定义Controller、编写引导类、
启动测试

代码:

bianpom文件增加需要继承的父工程和起步以来

 <!--springboot工程需要继承的父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version></parent><dependencies><!--web开发的起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>

编写控制类:

java">package com.itheima.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {@RequestMapping("/hello") // 规定路径public String hello(){return "Hello Spring Boot !";}
}

总结:

小结
SpringBoot在创建项目时,使用jar的打包方式。
SpringBoot的引导类,是项目入口,运行main方法就可以启动项目
使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样。

创建spring Initializr

首先我们勾选web 的depen

构建controller

java">@RestController
public class HelloController {@RequestMapping("/hello")public String hello() {return "hello Spring Boot 222!";}
}

运行引导类:

java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringbootInitApplication {public static void main(String[] args) {SpringApplication.run(SpringbootInitApplication.class, args);}}

SpringBoot 起步依赖原理分析

起步依赖原理分析
1)spring-boot-starter-parent

2)spring-boot-starter-web

小结:

1.在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本。
2.在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程
3.我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题。

SpringBoot 配置

配置文件分类

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。

properties:

server.port=8080

yaml

server:port: 8080

如果我们在application.properties或者application.yml(application.yaml)都进行配置。生效的优先如下:

pplication.properties > application.yml > application.yam

小结:

SpringBoot提供了2种配置文件类型:properteis和yml/yam
默认配置文件名称:application
在同一级目录下优先级为:properties>yml>yaml

yaml

YAML全称是YAML Ain't Markup Language。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如:C/C++,Ruby,Python,Java,Per,C#,PHP等。YML文件是以数据为核心的,比传统的xmI方式更加简洁。RYAML文件的扩展名可以使用.yml或者.yaml。

各个写法之间的区别:

properties:

server.port=8080
server.address=127.0.0.1

xml:

<server><port>8080</port><address>127.0.0.1</address>
</server>

yml:

server:port: 8080address: 127.0.0.1

简洁,以数据为核心

YMAL核心的语法:

1.大小写敏感
2.数据值前边必须有空格,作为分隔符
3.使用缩进表示层级关系
4.缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)。

5.缩进的空格数目不重要,只要相同层级的元素左侧对齐即可# 表示注释,从这个字符一直到行尾,都会被解析器忽略。

# 表示注释,从这个字符一直到行尾,都会被解析器忽略。

server:port:8080address: 127.0.0.1
name: abc

YAML数据格式:

# 对象(map):键值对的集合
person:name: zhangsanage: 20address:- beijing- shanghai
# 行内写法
person: {name: zhangsan}# 数组: 一组按次序排列的值
address:- beijing- shanghai
# 行内写法
address: [beijing,shanghai]# 纯量:单个的、不可再分的值msg1: 'hello \n world' # 单引忽略转义字符msg2: "hello \n world" # 双引识别转义字符

参数引用:

name: lsisperson:name: ${name}

小结:

读取配置文件内容

读取配置内容

1)@Value

    // 第一种:使用value的方法的进行@Value("${name}")private String name;

2)Environment

    @Autowiredprivate Environment env; // 直接初始化环境的对象System.out.println(env.getProperty("person.name"));System.out.println(env.getProperty("address[0]"));

3)@ConfigurationProperties

// Person 类被spring所识别
@Component// 会把yml中的的name: abc注入进去 而不会注入Person对象的属性值,指定前缀才行
//@ConfigurationProperties// 注入Person对象的属性值
@ConfigurationProperties(prefix = "person")System.out.println(person); // Person{name='abc', age=0} 或 Person{name='zhangsan', age=20} (加了前缀后生成的)
// 重新定义成员变量
String[] address = person.getAddress();// 返回数组地址,然后address指向该地址
// 打印
for (String s:address){System.out.println(s);
}

profile

我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。

1) profile配置方式

多profile文件方式

在创建3个属性文件。

激活



yml多文档方式


2) profile激活方式

配置文件 
# 无激活就默认为8080端口#spring.profiles.active=dev # 8081
#spring.profiles.active=test # 8082
#spring.profiles.active=pro # 8083

虚拟机参数

这时端口从pro转换为test  (8083-8082)

或者

则端口变成了8083了。


命令行参数

首先打成jar包

然后运行 这个时候 我遇到了报错 主要原因module中的存在两个主类 具体的解决方法可以看下面的。我的做法是在pom文件中指定了一个主类:

    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!-- Set the main class --><mainClass>com.itheima.springbootprofiles.SpringbootProfilesApplication</mainClass></configuration></plugin></plugins></build>

可以参考这老帖子的解释:

Unable to find a single main class from the following candidates [app.datapool.util.AESUtil, app.dat-CSDN博客

spring boot打包部署 XXX.jar中没有主清单属性或者Error: Invalid or corrupt jarfile_springboot打成jar启动报error: invalid or corrupt jarfil-CSDN博客

小结

内部配置加载顺序

从上到下为加载的优先级顺序,我们一般配置的yml文件 在打包时,就会默认加载到我们的classpath:/目录下。

下面是我们举的例子:

1会默认覆盖2的内容 1>2 

现在我们创建新的配置文件

这时候 则会继续覆盖之前的内容

我们在模块外面创建属性文件时候 1>2 且大于上面的12 的优先级的。

外部配置加载顺序

SpringBoot 整合其他框架

整合Junit



整合redis

启动redis服务

编写测试方法

先写入数据

获取数据

整合MyBatis

首先我们在配置好的mysql的前提下 创建库和表格 然后插入数据

CREATE DATABASE /*!32312 IF NOT EXISTS*/`springboot` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;USE `springboot`;/*Table structure for table `t_user` */DROP TABLE IF EXISTS `t_user`;CREATE TABLE `t_user` (`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,`password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;/*Data for the table `t_user` */insert  into `t_user`(`id`,`username`,`password`) values (1,'zhangsan','123'),(2,'lisi','234');

首先创建user类

配置属性文件内容为mysql的信息

首先是不写配置文件的方式进行测试

再然后是配置文件的方法


http://www.ppmy.cn/embedded/19960.html

相关文章

【研发管理】产品经理知识体系-产品创新中的市场调研

导读&#xff1a;在产品创新过程中&#xff0c;市场调研的重要性不言而喻。它不仅是产品创新的起点&#xff0c;也是确保产品成功推向市场的关键步骤。对于产品经理系统学习和掌握产品创新中的市场调研相关知识体系十分重要。 目录 概述&#xff1a;市场调研重要性 1、相关概…

AIGC学习步骤

目录 AIGC学习步骤 步骤一&#xff1a;理解基本概念 步骤二&#xff1a;学习资源 步骤三&#xff1a;深入研究 步骤四&#xff1a;联系专家 步骤五&#xff1a;实践应用 步骤六&#xff1a;持续学习 AIGC学习步骤 我们先来说说什么是AIGC&#xff1f; 生成式人工智能—…

TensorFlow 用 hashtable 的意义

TF的hashtable用来存不连续的id/int的embedding的&#xff0c; 就是比如id从1-100000&#xff0c;但1-100000里有很多值是空的&#xff0c; 如果id就是1-500&#xff0c;是满的&#xff0c;从1-500都有值&#xff0c;可以用一个 501 * hidden_size 的embedding_matrix存embed…

windows环境下安装Apache

首先apache官网下载地址&#xff1a;http://www.apachelounge.com/download/按照自己的电脑操作系统来安装 这里我安装的是win64 主版本是2.4的apache。 然后解压压缩包到一个全英文的路径下&#xff01;&#xff01;&#xff01;一定一定不要有中文 中文符号也不要有&#xff…

设计模式之过滤器模式

1、详细介绍 过滤器模式&#xff08;Filter Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许用户使用不同的标准&#xff08;过滤条件&#xff09;对一组对象进行过滤操作&#xff0c;得到满足特定条件的对象子集。这种模式通过定义一系列可重用的过滤器&#xff0…

vue echarts 柱状图 堆叠柱状图

echarts堆叠柱状图&#xff08;效果图在文章末尾&#xff09; 1、默认只显示 月度的 数据&#xff0c;手动点击 legend 季度的 数据才会显示&#xff1b; 2、监听左侧菜单栏的宽度变化&#xff0c;图表宽度自适应展示 <template><div><div id"barChart&q…

(成品论文22页)24深圳杯数学建模A题1-4问完整代码+参考论文重磅更新!!!!

论文如下&#xff1a; 基于三球定位的多个火箭残骸的准确定位 针对问题一&#xff1a;为了进行单个残骸的精确定位&#xff0c;确定单个火箭残骸发生音爆 时的精确位置和时间&#xff0c;本文基于三球定位模型&#xff0c;考虑到解的存在性和唯一性&#xff0c; 选取了四个监测…

Bytebase 2.16.0 - 支持 Oracle 和 SQL Server DML 变更的事前备份

&#x1f680; 新功能 支持 Oracle 和 SQL Server DML 变更的事前备份。 支持在 SQL 编辑器中显示存储过程和函数。 支持兼容 TDSQL 的 MySQL 和 PostgreSQL 版本。 支持把数据库密码存储在 AWS Secrets Manager 和 GCP Secret Manager。 支持通过 IAM 连接到 Google Clou…