SpringBoot学习笔记

Posted 想成为大师啊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot学习笔记相关的知识,希望对你有一定的参考价值。

微服务阶段

  • JavaSE:面向对象
  • mysql + JDBC:持久化存储
  • html + css +javascript + Jquery + 框架:视图,框架
  • JavaWeb:开始独立开发MVC三层架构的网站(原始)
  • SSM:框架(简化了我们的开发流程,配置也开始较为复杂)
  • war:Tomcat运行
  • Spring再简化:SpringBoot - Jar(内嵌Tomcat)- 微服务架构

    SpringCloud

Spring

Spring是一个开源框架,2003年兴起的一个轻量级的Java开发框架。Spring是为了解决企业级应用开发的复杂性而创建的,简化开发

为了降低Java开发的复杂性,Spring采用了以下4种关键策略:

  • 1、基于POJO的轻量级和最小侵入性编程
  • 2、通过IOC,依赖注入(DI)和面向接口实现松耦合;
  • 3、基于切面(AOP)和惯例进行声明式编程
  • 4、通过切面和模板减少样式代码

核心思想:约定大于配置!!!

(程序猿)程序 = 数据结构 + 算法(集合框架)

(码农)程序 = 面向对象 + 框架


微服务架构

微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用必须构建一系列小服务的组合;可以通过http方式进行互通。要说微服务架构,先得说说过去我们的单体应用架构

单体应用架构:

  • 所谓单体应用架构(all in one)是指,我们将一个应用的中的所有应用服务都封装在一个应用中。
  • 无论是ERP、CRM或是其他什么系统,你都把数据库访问,web访问,等等各个功能放到一个war包内
  • 这样做的好处是:易于开发和测试;也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。
  • 单体应用框架的缺点是:哪怕我要修改一个非常小的地方,我都需要停掉整个服务、重新打包、部署这个应用war包。特别是对于一个大型应用,我们不可能把所有内容放在一个应用里面,我们如何维护、如何分工合作都是问题

微服务架构:

  • all in one的架构方式,我们把所有的功能单元放在一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后在负载均衡。
  • 所谓微服务架构,就是打破之前all in one的架构方式,把每个功能元素独立出来。把独立出来的功能元素的动态组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素进行复制,而没有对整个应用复制
  • 这样做的好处:
    • 1、节省了调用资源
    • 2、每个功能元素的服务都是一个可替换的、可独立升级的软件代码

高内聚,低耦合!!!


如何构建微服务

一个大型系统的微服务架构,就像一个复杂交织的神经网络,每一个神经元就是一个功能元素,它们各自完成自己的功能,然后通过http相互请求调用。比如一个电商系统,查缓存、连数据库、浏览页面、结账、支付等服务都是一个个独立的功能服务,都被微化了,它们作为一个个微服务共同构建一个庞大的系统。如果修改其中的一个功能,只需要更新升级其中一个功能服务单元即可。

但是这种庞大的系统架构给部署和运维带来很大的难度。于是,Spring为我们带来了构建大型分布式微服务的全套、全程产品:

  • 构建一个个功能独立的微服务应用单元,可以使用SpringBoot,可以帮我们快速构建一个应用;
  • 大型分布式网络服务的调用,这部分由Spring Cloud来实现,实现分布式;
  • 在分布式中间,进行流式数据计算、批处理,我们有Spring Cloud Data Flow。
  • Spring为我们想清楚了整个从开始构建应用到大型分布式应用全流程方案。

第一个SpringBoot程序

官方:提供一个快速生成的网站,IDEA集成了这个网站

  • 可以在官网直接下载后,导入idea开发(官网在哪)
  • 可以直接使用idea创建一个SpringBoot项目(一般开发直接在IDEA中创建)

官网网址:https://spring.io/projects/spring-boot

进入官网后,点击Spring Initializr


在官网配置好项目后,就可以点击下面的 GENERATE CTRL + 回车
。然后会得到一个项目压缩包,解压后,就可以导入到 idea 中。


如果是在idea工具里面进行配置的话,一定要注意,下载来源不要默认,而要加上阿里云镜像!!!!


后面的过程就和官网配置页面设置一样,选好后,就可以进入到项目中编写了。

package com.blb.demo.controller;

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

@Controller
@RequestMapping("/hello")
public class HelloController 

    @GetMapping("/hello")
    @ResponseBody
    public String hello()
        return "hello,world";
    


当我们写好第一个接口后,就可以在本地上跑一下了

成功!!!


原理初探

自动配置:

pom.xml

  • spring-boot-dependencies:核心依赖在父工程中
  • 我们在写或者引入一些SpringBoot依赖的时候,不需要指定版本,就因为有这些版本仓库

启动器:

<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
  • 启动器就是SpringBoot的启动场景
  • 比如spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖!
  • SpringBoot会将所有的功能场景,都变成一个个的启动器
  • 我们要使用什么功能,就只需要找到对应的启动器就可以了 starter

主程序:

package com.blb.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// @SpringBootApplication : 标注这个类是一个SpringBoot的应用(启动类下的所有资源被导入)
@SpringBootApplication
public class DemoApplication 

    public static void main(String[] args) 
    	// 将SpringBoot应用启动
        SpringApplication.run(DemoApplication.class, args);
    


  • 注解
    • @SpringBootConfiguration:SpringBoot的配置
      • @Configuration:Spring配置类
      • @Component:说明这也是一个Spring的组件
    • @EnableAutoConfiguration:自动配置
      • @AutoConfigurationPackage:自动配置包
        • @Import(AutoConfigurationPackages.Registrar.class):自动配置 包注册
      • @Import(AutoConfigurationImportSelector.class):自动导入选择
      • 获取所有的配置:
        • List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

获取候选的配置:

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) 
		List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
				getBeanClassLoader());
		Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
				+ "are using a custom packaging, make sure that file is correct.");
		return configurations;
	

META-INF/spring.factories:自动配置的核心文件

所有资源加载到配置类中!

Properties properties = PropertiesLoaderUtils.loadProperties(resource);

结论:SpringBoot所有自动配置都是在启动的时候扫描并加载(spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!)

  • 1、SpringBoot在启动的时候,从类路径下 /META-INF/spring.factories获取指定的值;
  • 2、将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置
  • 3、以前我们需要自动配置的东西,现在SpringBoot帮我们做了!
  • 4、整个JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下
  • 5、它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
  • 6、容器中也会存在非常多的xxxAutoConfiguration@Bean的文件,就是这些类给容器中导入了这个场景需要的所有组件;并自动配置。@Configuration,JavaConfig!
  • 7、有了自动配置类,免去了我们手动编写配置文件的工作了!

SpringApplication.run分析:分析该方法主要分为两部分

  • 1、SpringApplication的实例化
  • 2、run方法的执行

SpringApplication:这个类主要做了以下四件事情

  • 1、推断应用的类型是普通的项目还是Web项目
  • 2、查找并加载所有可用初始化器,设置到initializers属性中
  • 3、找出所有的应用程序监听器,设置到listeners属性中
  • 4、推断并设置main方法的定义类,找到运行的主类

查看构造器:

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) 
        this.sources = new LinkedHashSet();
        this.bannerMode = Mode.CONSOLE;
        this.logStartupInfo = true;
        this.addCommandLineProperties = true;
        this.addConversionService = true;
        this.headless = true;
        this.registerShutdownHook = true;
        this.additionalProfiles = new HashSet();
        this.isCustomEnvironment = false;
        this.lazyInitialization = false;
        this.resourceLoader = resourceLoader;
        Assert.notNull(primarySources, "PrimarySources must not be null");
        this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
        this.webApplicationType = WebApplicationType.deduceFromClasspath();
        this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = this.deduceMainApplicationClass();
    

SpringBoot:配置文件及自动配置原理

配置文件:SpringBoot使用一个全局的配置文件,配置文件名称是固定的

  • application.properties
    • 语法结构:key = value
  • application.yaml
    • 语法结构:key: 空格 value

配置文件的作用:修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了;


YAML

YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。(取自百度百科)

标记语言:以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml

  • yaml配置:

    server:
    	port: 8080
    
    // 普通的key-value
    name: huake
    
    // 对象
    student:
    	name: huake
    	age: 3
    
    // 行内写法
    studednt: name: huake, age: 3
    
    // 数组
    pets:
      - cat
      - dog
      - pig
    
    pets: [cat, dog, pig]
    
  • xml配置:

    <server>
    	<port>8080</port>
    </server>
    
  • properties只能写键值对

    name=huake
    
    student.name = huake
    student.age = 3
    

YAML语法

基本语法:

k:(空格) v

以此来表示一对键值对(空格不能省略);以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。

注意:属性和值的大小写都是十分敏感的。例如:

server:
	port: 8080
	path: /hello

值的写法:字面量: 普通的值 [数字, 布尔值, 字符串]

k: v

字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号;"" 双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思;

比如:name: "kuang \\n shen"

输出:

kuang
shen

以上是关于SpringBoot学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot学习笔记——自动配置原理

Springboot学习笔记

springBoot学习笔记初识springBoot

SpringBoot学习笔记.pdf,这个太全了!

springboot学习笔记

SpringBoot学习笔记