Spring Boot学习笔记整理

1、Sring Boot与Spring Cloud

二者都是Spring家族中的顶级项目

Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务,Spring Boot,看名字就知道是Spring的引导,就是用于启动Spring的,使得Spring的学习和使用变得快速无痛。不仅适合替换原有的工程结构,更适合微服务开发。

Spring Cloud基于Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。

Spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot来实现。


学过Spring的都知道,Spring开发有非常头疼的三点:

以启动一个带Hibernate的Spring MVC为例。
1. 依赖太多,而且要注意版本兼容。这个应用,要添加10-20个依赖,Spring相关的包10多个,然后是Hibernate包,Spring与Hibernate整合包,日志包,json包一堆,而且要注意版本兼容性。

2. 配置太多,要配置注解驱动,要配置数据库连接池,要配置Hibernate,要配置事务管理器,要配置Spring MVC的资源映射,要在web.xml中配置启动Spring和Spring MVC等

3. 部署和运行麻烦 。要部署到tomcat里面。不能直接用java命令运行。

太多重复和大家都一样的配置了。


Spring Boot的哲学就是 约定大于配置 。既然很多东西都是一样的,为什么还要去配置。

Spring Boot的三大魔法:
1. 通过starter和依赖管理 解决依赖 问题。
2. 通过自动配置, 解决配置复杂 问题。
3. 通过内嵌web容器,由应用启动tomcat,而不是tomcat启动应用,来 解决部署运行 问题。


Spring Cloud体系就比较复杂了。基本可以理解为通过Spring Boot的三大魔法, 将各种组件整合 在一起,非常简单易用。

你可以把spring boot的官方的包分为两类,一种是为了搭建一个服务用的,比如hibernate jpa,比如 message。另外一种含有cloud关键字的,是为了各个spring boot之间管理和使用的包。

因为当把集群、CI等方法集中进来一起考虑的时候,这件事情就复杂了。

多个小有服务整合成的大服务,要有一个消息总线来用于互相通知和调用,要有一个服务发现程序来管理某个小服务上线可用,同时在服务离线时也要能处理,各个小服务要尽量各自独立,还要考虑服务的依赖性,集群的负载均衡,配置文件的分离。

再把CI和Docker拿进来一起考虑的话,更乱。

但我认为这样完成的一个服务是更具有可插拔性,更容易维护的。而且遵循了上面的cloud方案的话,在服务的健壮性上面也很强。

写到这里对于新接触的我认为可以先从单独的spring boot程序开始入门,当要添加一个新功能时,考虑拆分成另外服务。两个程序间可以通过 jmx或是 其它消息中间件或是rest通讯。最后实现了一个各自独立的功能集群。

直白地说: Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring boot,属于依赖的关系。


2、Spring Boot入门

2.1 运行环境

  • java 8及以上
  • Maven 3.3+ 或 Gradle 4.4+

2.2 手动创建Spring Boot的WEB项目

2.2.1 创建maven项目添加依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>

    
    <parent>   <!-- 继承默认值为Spring Boot -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <dependencies>
    
        <dependency>  <!--Web应用程序的依赖项-->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
    </dependencies>
    
</project>

2.2.2 创建启动项

package demo;

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

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class,args);
    }
}

注意包的层次,可能会导致不能够成功启动。


2.2.3 Hello World

package com.example.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping(name = "/hello")
    public String helloWorld(){
        return "Hello World!";
    }
}

2.2.4 运行main方法

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v2.1.3.RELEASE)
....... . . .
....... . . . (log output here)
.......  Tomcat started on port(s): 8080 (http) with context path ''
........ Started DemoApplication in 2.222 seconds (JVM running for 6.514)

出现最后两行行字样,说明Spring Boot启动成功。
倒数第二行的port(s): 8080为端口号。


2.2.5 访问 localhost:8080/hello

出现响应内容,即为项目创建成功。


2.3 IDE创建Spring Boot项目

File >>>> New >>>> Project / Module

使用IDE创建好项目后,可以将项目中一些不需要的文件或文件夹删除掉


2.4 部分注解介绍

2.4.1 @RestController和 @RequestMapping

  • @RestController的作用相当于@Controller + @ResponseBody,用于提醒返回的内容不是视图名,而是字符串,属于Spring MVC注解。
  • @RequestMapping提供“路由”信息,使得任何符合[/hello]的http请求都可以映射到其注释的方法,该注解也是Spring MVC的。
  • 具体可以参考Spring MVC 部分

2.4.2 @EnableAutoConfiguration

  • @EnableAutoConfiguration的作用启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置,快速入门的demo实际没有用到该注解。
  • 自动配置旨在与“启动器”配合使用,但这两个概念并不直接相关。您可以自由选择jar依赖项。Spring Boot仍然尽力自动配置您的应用程序。

2.4.3 @SpringBootApplication

  • 它是一个复合注解,包括@ComponentScan,和@SpringBootConfiguration,@EnableAutoConfiguration。

2.4.4 @SpringBootConfiguration

  • 它继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中并且实例名就是方法名

2.4.5 @ComponentScan

  • @ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。是以前的context:component-scan(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。

2.4.6 其他注解

Spring Boot注解说明


2.5 配置文件

Spring Boot 整个应用程序只有一个配置文件,application.properties 或 application.yml 文件。由于Spring Boot使用了很多默认配置,而且我们也可以在这个配置文件中修改配置信息去覆盖默认配置。
这里主要介绍两种文件结构。

2.5.1 application.properties文件结构


server.port=8081                    #修改Tomcat端口 
server.servlet.context-path=/api	#请求前缀
     
     
#如2.2中进行这两项修改,
#请求路径将由 http://localhost:8080/hello 变更为http://localhost:8081/api/hello


2.5.2 application.yml文件结构

server:
  port: 8081
  servlet:
    context-path: /api


#类似于文件夹一样,同一父目录下的配置名可以通过缩进进行表示,不同父目录下的需要另外起行
#效果与2.5.1中的相同

2.5.3 多环境配置

在一个企业级系统中,我们可能会遇到这样一个问题:开发时使用开发环境,测试时使用测试环境,上线时使用生产环境。每个环境的配置都可能不一样,比如开发环境的数据库是本地地址,而测试环境的数据库是测试地址。那我们在打包的时候如何生成不同环境的包呢?

这里的解决方案有很多:

  • 每次编译之前手动把所有配置信息修改成当前运行的环境信息。这种方式导致每次都需要修改,相当麻烦,也容易出错。
  • 利用 Maven,在 pom.xml 里配置多个环境,每次编译之前将 settings.xml 里面修改成当前要编译的环境 ID。这种方式会事先设置好所有环境,缺点就是每次也需要手动指定环境,如果环境指定错误,发布时是不知道的。
  • 第三种方案强烈推荐的方式。

.yml 格式为例:

第一步: 创建application.yml文件,进行如下配置


spring:
  profiles:
    active: dev

#表示应用dev配置文件

第二步: 创建 application-{profiles}.yml 文件,并进行相应环境配置
{profiles} 为被替换内容,我们创建的文件名为 application-dev.yml.properties文件相同只需要将文件后缀改为 .properties 即可。


2.5.4 Spring Boot配置大全

学习尚硅谷视频整理的文档 Spring Boot 1 1 Spring Boot入门 4 1.1 简介 4 1.2 微服务(martin fowler发表了一篇文章) 5 1.3 环境约束 7 1.4 第一个Spring Boot项目(jar):HelloWorld 8 1.5 入门案例详解 11 1.5.1 POM文件 11 1.5.2 主程序类,主入口类 12 1.6 使用Spring Initializer向导快速创建Spring Boot 16 2 Spring Boot配置 18 2.1 配置文件 18 2.2 YML语法 19 2.3 YML配置文件值获取 21 2.4 properties配置文件乱码问题 24 2.5 @ConfigurationProperties与@Value的区别 25 2.6 配置@PropertySource、@ImportResource、@Bean 27 2.7 配置文件占位符 30 2.8 Profile多环境支持 31 2.9 配置文件的加载位置 33 2.10 外部配置加载顺序 36 2.11 自动配置原理 37 2.12 @Conditional派生注解 41 3 Spring Boot与日志 42 3.1 日志框架分类和选择 42 3.2 SLF4j使用 43 3.3 其他日志框架统一转换成slf4j+logback 44 3.4 Spring Boot日志使用 45 3.5 Spring Boot默认配置 47 3.6 指定日志文件和日志Profile功能 52 3.7 切换日志框架(不使用SLF4j+LogBack) 54 4 Spring Boot与Web开发 55 4.1 Web开发简介 55 4.2 静态资源映射规则 56 4.3 引入Thymeleaf 60 4.4 Thymeleaf语法 61 4.5 SpringMVC自动配置原理 67 4.6 SpringBoot扩展与全面接管 70 4.7 如何修改SpringBoot的默认配置 72 4.8 【实验】CRUD操作 73 4.8.1 默认访问首页 73 4.8.2 登录页面国际化 74 4.8.3 登录 80 4.8.4 拦截器进行登录检查 81 4.8.5 实验要求(没按要求做,不想改了!) 82 4.8.6 CRUD-员工列表 83 4.8.7 CRUD-员工修改 86 4.8.8 CRUD-员工添加 87 4.8.9 CRUD-员工删除 88 4.9 错误处理原理&错误页面定制 90 4.10 配置嵌入式Servlet容器(springboot 1.50版本) 97 4.10.1 如何定制和修改Servelt容器的相关配置 97 4.10.2 注册servlet三大组件【servlet,filter,listener】 98 4.10.3 替换为其他嵌入式容器 102 4.10.4 嵌入式servlet容器自动配置原理 103 4.10.5 嵌入式servlet容器启动原理 103 4.11 使用外置的Servlet容器 104 4.11.1 步骤 104 4.11.2 原理 107 5 Spring Boot与Docker(虚拟化容器技术) 110 5.1 简介 110 5.2 核心概念 111 5.3 安装Docker 112 5.4 Docker常用命令&操作 113 5.5 安装MySQL示例 114 6 Spring Boot与数据访问 115 6.1 JDBC 115 6.1.1 实现 115 6.1.2 自动配置原理 116 6.2 整合Durid数据源 117 6.3 整合Mybatis 122 6.3.1 注解版 123 6.3.2 配置文件版 124 6.4 整合SpringData JPA 125 6.4.1 SpringData简介 125 6.4.2 整合 126 7 Spring Boot启动配置原理 128 7.1 启动流程(Springboot 1.50版本) 128 7.1.1 创建SpringApplication对象 129 7.1.2 运行run方法 130 7.1.3 编写事件监听机制 132 8 Spring Boot自定义starters 136 8.1 概述 136 8.2 步骤 137 9 更多Springboot整合示例 144 10 Spring Boot与缓存 145 10.1 JSR107缓存规范 145 10.2 Spring的缓存抽象 146 10.2.1 基本概念 146 10.2.2 整合项目 146 10.2.3 CacheEnable注解 148 10.2.4 Cache注解 150 10.3 整合redis 154 10.3.1 在Docker上安装redis 154 10.3.2 Redis的Template 154 10.3.3 整合(百度) 155
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值