Spring Boot入门

Spring Boot概述

微服务概述

微服务

微服务(英语:Microservices)是一种软件架构风格,它是以专注于单一责任与功能的小型功能区块 (Small Building Blocks) 为基础,利用模块化的方式组合出复杂的大型应用程序,各功能区块使用与语言无关 (Language-Independent/Language agnostic)的API集相互通信;2014年,Martin Fowler 与 James Lewis 共同提出了微服务的概念,定义了微服务是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

单体应用

  • 单体应用:一个单块应用系统是以一个单个单元的方式来构建的。企业应用系统经常包含三个主要部分:客户端用户界面、数据库和服务端应用系统,这里的服务端应用系统就是一个单体的应用,系统中任意逻辑发生变化都会导致重新构建部署一个新版本的服务端应用系统。针对单体应用,当访问量变大时,通常采用负载均衡,横向扩展的方式将多个单体应用部署到多个服务器上访问。
  • 单位应用缺点:软件变更受到了很大的限制,应用系统的一个很小的部分的一处变更,也需要将整个单块应用系统进行重新构建和部署。不能根据用户需求部署应用系统中的功能模块,只能扩展部署整个应用系统。

微服务应用搭建

要搭建一个微服务,运维和部署都变得非常复杂,spring提供一套解决方案

  • SpringBoot:快速构建单个服务(简化开发)

  • SpringCloud:是一系列有序框架的集合,其主要的设施有,服务发现与注册,配置中心,消息总线,负载均衡,断路器,数据监控等,通过Spring Boot的方式,可以实现一键启动,和部署。

  • Spring cloud data flow: 为基于微服务的分布式流处理和批处理数据通道提供了一系列模型和最佳实践.

Spring Boot简介

Spring-Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。个人理解来说Spring-Boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,Spring-Boot整合了其他相关联框架。

SpringBoot是整合了其他技术的框架:spring整合其他技术的时候自己手动完成整合的过程。
SpringBoot 是对spring技术栈的一次整合。

Spring Boot优势

  • 快速构建项目
  • 对主流开发框架的无配置集成
  • 项目可独立运行,无须外部依赖Servlet容器
  • 提供运行时的应用监控
  • 极大的提高了开发、部署效率
  • 与云计算的天然集成

Spring Boot的核心功能

独立运行Spring项目

Spring Boot 可以以jar包形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar来运行。

内嵌servlet容器

Spring Boot可以选择内嵌Tomcat、jetty或者Undertow,这样我们无须以war包形式部署项目。

提供starter(启动器)简化Maven配置

spring提供了一系列的start pom来简化Maven的依赖加载,例如,当你使用了spring-boot-starter-web会自动加入

自动装配Spring

Spring Boot会根据在类路径中的jar包,类、为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。当然,Spring Boot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而Spring Boot也有提供支持,则可以自定义自动配置。

准生产的应用监控

Spring Boot提供基于http ssh telnet对运行时的项目进行监控

无代码生成和xml配置

Spring Boot不是借助与代码生成来实现的,而是通过条件注解来实现的,这是Spring4.x提供的新特性。

Spring Boot入门程序

创建maven工程导入springboot依赖

  <!--继承指定的父模块pom.xml文件:对项目进行整体的管理维护,如统一版本管理-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
    </parent>
    <!--spring提供的web项目启动器模块-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter 相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器 。

编写spring Boot的主程序

主程序代码

@SpringBootApplication
public class Example {
    public static void main(String[] args) {
        /**
         * 启动springboot
         */
        SpringApplication.run(Example.class,args);
    }
}

@SpringBootApplication: 注解说明这个类是SpringBoot的主配置类,SpringBoot 就应该运行这个类的main方法来启动SpringBoot应用;并将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器

编写Controller代码

@Controller
public class TestController {

    @RequestMapping("/hello")
    @ResponseBody
    public String helloWorld(){
        return "Hello world!";
    }
}

Spring Boot配置文件

配置文件的作用及规范

Spring Boot使用一个全局的配置文件,配置文件名是固定的;默认使用以下两种格式: 
application.properties 
application.yml 
配置文件的作用:修改SpringBoot自动配置的默认值;
Spring Boot启动时会根据配置文件自动注册相关的应用组件

yaml配置文件

yaml的语法

YAML:以数据为中心配置语言,比json、xml等更适合做配置文件(以格式为中心的语言,强调标签结构);
  • (1)基本语法
– 使用缩进表示层级关系
– 缩进时不允许使用Tab键,只允许使用空格。
– 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 – 大小写敏感(严格区分大小写内容)
- 键值对中间必须要有空格k:(空格)v
  • (2)值的写法

YAML 支持的三种数据结构:

字面量:普通的值(数字,字符串,布尔)

server: 
  port: 8081  admin  true...
注意:字符串默认不用加上单引号或者双引号; 
双引号:特殊符号表示转义符本身;
name: "zhangsan \n lisi":输出;zhangsan 换行 lisi
单引号;特殊字符就表示字符本身;
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

对象、Map(属性和值)(键值对)

person:
  name: zhangsan
  age: 12
另一种行内写法:
person: {name: zhangsan,age: 12}

数组(List,Set)

hobbies:
 - singing
 - dancing
 - running
用-(空格)值表示数组中的一个元素
另一种行内写法:
hobbies: [singing,dancing,running]

yaml参考文档

配置文件值的注入

(1)构建bean对象

//只有spring容器中的对象才能自动进行数据绑定
@Component
//将本类中的所有属性和配置文件中相关的配置进行绑定;
// prefix指定要绑定的配置文件中的属性前缀;
@ConfigurationProperties(prefix = "person")
public class Person {
    private String pname;
    private int age;
    private boolean success;
    private Date birth;

    private Car car;
    private Map<String,Object> maps;
    private List<Object> lists;
    }

(2)构建配置文件

person:
  pname: zhangsan
  age: 12
  birth: 2020/12/12
  success: true
  car:
    cname: 奔驰
    cprice: 200.0
  lists: [唱歌,跳舞]
  lists:
   - 唱歌
   - 跳舞
  maps: {key1: v1,key2: v2}
  maps:
     key1: v1
     key2: v2

(3)执行单元测试查看person对象的值

@SpringBootTest
class SpringbootApplicationTests {
    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

properties配置文件

properties语法

以KEY=VALue键值对的方式设置值

字面量:普通的值(数字,字符串,布尔)

name=张三

对象、Map(属性和值)(键值对)

person.name=张三
person.age=12
maps.key1=value1
maps.key2=value2

数组(List,Set)

hobbies=singing,dancing,running

配置文件值的注入

(1)构建bean对象

//只有spring容器中的对象才能自动进行数据绑定
@Component
//将本类中的所有属性和配置文件中相关的配置进行绑定;
// prefix指定要绑定的配置文件中的属性前缀;
@ConfigurationProperties(prefix = "person")
public class Person {
    private String pname;
    private int age;
    private boolean success;
    private Date birth;

    private Car car;
    private Map<String,Object> maps;
    private List<Object> lists;
    }

(2)构建配置文件

person.pname=张三
person.age=12
person.birth=2019/12/12
person.success=true
person.car.cname=宝马
person.car.cprice=100.0
person.lists=唱歌,跳舞,跑步
person.maps.k1=value1
person.maps.k2=value2

(3)执行单元测试查看person对象的值

@SpringBootTest
class SpringbootApplicationTests {
    @Autowired
    private Person person;
    @Test
    void contextLoads() {
        System.out.println(person);
    }

}

@ConfigurationProperties注解和@Value注解的区别

  • @ConfigurationProperties注解用于根据配置文件批量注入值,springboot默认配置文件application.yml/application.properties;
  • @Value注解用于根据配置文件单个注入值;
区别 @ConfigurationProperties @Value
SpEL 不支持 支持
复杂类型封装 支持 不支持
案例:
@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
    @Value("${person.pname}")
    private String pname;
    @Value("#{12*2}")
    private int age;
    private boolean success;
    private Date birth;
    private Car car;
    private Map<String,Object> map;
    private List<Object> hobbies;
    }

配置文件中的占位符

  • springboot全局配置文件中可以使用随机数
    ${random.value}、${random.int}、${random.long}
    ${random.int(10)}、$
  • springboot全局配置文件中可以使用占位符
    通过${属性名}获取已经在配置文件中加载过的属性值;
    通过${属性名:默认值}来指定找不到属性时的默认值;
案例:
person.pname=张三
person.age=${random.int}
person.success=true
person.birth=2012/12/12
person.car.cname=${car.cname:奔驰}
person.car.cprice=200.0
person.map.key1=value1
person.map.key2=value2
person.hobbies=唱歌,跳舞,跑步

多环节支持

Profile是Spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境;

多文件多环节形式

格式:application-{profile}.properties/yml
例如:可以在项目中创建如下主配置文件:application-dev.properties、application-test.properties、application-prod.properties、application.properties,默认使用application.properties,可以通过配置spring.profiles.active=profile指定使用某个环境的配置文件。

yaml支持单文件多环境形式

server:
  port: 8080
person:
  pid: 123
  pname: admin
  bir: 2021/10/09
  dog:
    dogName: 小黑
  maps: {key1: value1,key2: value2}
  nums:
    - 123
    - 45
    - 789
  stringList: [str1,str2,str3]
spring:
  profiles:
    active: dev1
---
server:
  port: 8086
spring:
  config:
    activate:
      on-profile: test1
---
spring:
  config:
    activate:
      on-profile: dev1
server:
  port: 8087
---
spring:
  config:
    activate:
      on-profile: pro1
server:
  port: 8088

Spring Boot的Web开发

springboot关于静态资源的处理

springboot启动时会根据配置文件自动配置相应场景的组件xxxAutoConfiguration,web项目启动时会初始化WebMvcAutoConfiguration组件处理请求相关的操作,其中有默认处理静态资源的方法:
传统应用的做法: 
给项目添加 jquery  vue  css.....,直接将资源赋值粘贴到项目中。

springboot: jquery  vue .... 做成了jar文件,在pom文件中添加相关静态资源的jar,然后在项目中使用。


@Override
		protected void addResourceHandlers(ResourceHandlerRegistry registry) {
			super.addResourceHandlers(registry);
			if (!this.resourceProperties.isAddMappings()) {
				logger.debug("Default resource handling disabled");
				return;
			}
			ServletContext servletContext = getServletContext();
			addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
			addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
				registration.addResourceLocations(this.resourceProperties.getStaticLocations());
				if (servletContext != null) {
					registration.addResourceLocations(new ServletContextResource(servletContext, SERVLET_LOCATION));
				}
			});
		}
从该方法中可以发现:
1、默认情况下:
(1)匹配/webjars/** 的请求,都去 classpath:/META-INF/resources/webjars/ 找资源;
(2)匹配 "/**" 的请求,都去(静态资源的文件夹)找映射,静态资源文件夹路径如下ResourceProperties.java中:
"classpath:/META‐INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/" 
"/":当前项目的根路径
2、自定义配置静态资源路径:
spring.web.resources.static-locations=自定义路径
  • 1、webjars的使用
    • 可以通过webjars以jar包的方式引入静态资源。

静态资源坐标参考

(1)引入依赖

 <!--jquery的jar包引入-->
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.6.0</version>
        </dependency>

(2)启动服务访问资源

浏览器访问路径:http://localhost:8080/webjars/jquery/3.6.0/jquery.min.js获取相应的静态资源。

2、静态资源的存放位置

(1)默认存放位置查看

ResourceProperties.java----->Resources
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { 
 "classpath:/META-INF/resources/",
 "classpath:/resources/", 
 "classpath:/static/", 
 "classpath:/public/" 
 };

默认静态资源路径:
"classpath:/META‐INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/" 
"/":当前项目的根路径
案例:在上述任意路径下创建静态资源hello.html,浏览器访问路径:http://localhost:8080/hello.html获取相应的静态资源。


(2)自定义位置存放

在配置文件中通过属性spring.web.resources.static-locations=自定义路径,设置自定义静态资源存放路径;
案例:
a、配置文件中设置:spring.web.resources.static-locations= classpath:/hello/, classpath:/hello/
b、在自定义路径下添加静态资源hello.html,浏览器访问路径:http://localhost:8080/hello.html获取相应的静态资源。
注意:自定义静态资源路径后,默认静态资源路径失效(2.4.3版本中/META‐INF/resources/,自定义后式不会失效的)!
posted @ 2021-10-10 14:30  Lucky_龍  阅读(85)  评论(0)    收藏  举报