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

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文件增加需要继承的父工程和起步以来

XML 复制代码
 <!--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;

@RestController

public 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:

html 复制代码
server.port=8080

yaml

html 复制代码
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:

html 复制代码
server.port=8080
server.address=127.0.0.1

xml:

html 复制代码
<server>
    <port>8080</port>
    <address>127.0.0.1</address>
</server>

yml:

html 复制代码
server:
    port: 8080
    address: 127.0.0.1

简洁,以数据为核心

YMAL核心的语法:

1.大小写敏感

2.数据值前边必须有空格,作为分隔符

3.使用缩进表示层级关系

4.缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)。

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

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

html 复制代码
server:
    port:8080
    address: 127.0.0.1
name: abc

YAML数据格式:

html 复制代码
# 对象(map):键值对的集合
person:
  name: zhangsan
  age: 20
  address:
  - beijing
  - shanghai
# 行内写法
person: {name: zhangsan}


# 数组: 一组按次序排列的值
address:
  - beijing
  - shanghai
# 行内写法
address: [beijing,shanghai]

# 纯量:单个的、不可再分的值
 msg1: 'hello \n world' # 单引忽略转义字符
 msg2: "hello \n world" # 双引识别转义字符

参数引用:

html 复制代码
name: lsis

person:
    name: ${name}

小结:

读取配置文件内容

读取配置内容

1)@Value

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

2)Environment

html 复制代码
    @Autowired
    private Environment env; // 直接初始化环境的对象

    System.out.println(env.getProperty("person.name"));
    System.out.println(env.getProperty("address[0]"));

3)@ConfigurationProperties

html 复制代码
// 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激活方式
配置文件
html 复制代码
# 无激活就默认为8080端口

#spring.profiles.active=dev # 8081
#spring.profiles.active=test # 8082
#spring.profiles.active=pro # 8083
虚拟机参数

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

或者

则端口变成了8083了。

命令行参数

首先打成jar包

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

html 复制代码
    <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博客

小结

内部配置加载顺序

外部配置加载顺序

SpringBoot 整合其他框架

相关推荐
间彧7 分钟前
Spring Boot集成Spring Security完整指南
java
间彧30 分钟前
Spring Secutiy基本原理及工作流程
java
数据智能老司机1 小时前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
Java水解2 小时前
JAVA经典面试题附答案(持续更新版)
java·后端·面试
数据智能老司机2 小时前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
洛小豆4 小时前
在Java中,Integer.parseInt和Integer.valueOf有什么区别
java·后端·面试
前端小张同学4 小时前
服务器上如何搭建jenkins 服务CI/CD😎😎
java·后端
ytadpole4 小时前
Spring Cloud Gateway:一次不规范 URL 引发的路由转发404问题排查
java·后端
华仔啊4 小时前
基于 RuoYi-Vue 轻松实现单用户登录功能,亲测有效
java·vue.js·后端