SpringBoot入门及深入

1:设计初衷

  SpringBoot为我们开发者提供了一种更快速、体验更好的开发方式,我们可以开箱即用,无需像写Spring那样配置各种XML文件,虽然Spring3.0时引入了基于java的配置,但是编写这些配置无疑是在浪费大量时间,其实SpringBoot还内置Tomcat

2:核心功能

复制代码

一:独立的运行Spring

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

二:内置Servlet容器

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

三:简化Maven配置

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

四:自动装配

    SpringBoot会根据在类路径中的jar包,类、为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。

    当然,SpringBoot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而SpringBoot

    没有提供支持,则可以自定义自动配置

五:准生产的应用监控

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

六:无代码生产和xml配置

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

复制代码

Spring Boot只是Spring本身的扩展,使开发,测试和部署更加方便

3:本文开发环境需求

  SpringBoot 2.4.1正式发行版,要求Java8并且兼容Java15;对应的Spring版本是5.3.2;而且要求Maven 3.3+ 但是最好使用3.5.4稳定版本,而Servlet容器的版本为Tomcat9.0(Servlet Version 4.0)、Jetty 9.4(Servlet Version 3.1)、Undertow 2.0(Servlet Version 4.0) 

二:SpringBoot入门搭建

1:手动搭建案例

  我们以一个简单的SpringBoot案例来突显出Spring的繁琐,我接下来将使用SpringBoot来实现一个简单的带Controller的案例

复制代码

第一步:使用IDEA构建一个普通的Maven项目

第二步:在构建好的maven工程中对pom文件修改

第三步:编写启动引导类

第四步:编写Controller

第五步:访问(默认8080端口) 以本案例http://localhost:8080/index/test

复制代码

pom.xml里面添加相应坐标

启动引导类编写

Controller编写

2:使用Spring Initializr快速搭建

自动创建的Maven坐标说明

三:SpringBoot基本分析

1:坐标中starters分析及依赖管理

  starter是依赖关系的整理和封装。是一套依赖坐标的整合,可以让导入应用开发的依赖坐标更方便。利用依赖传递的特性帮我们把一些列指定功能的坐标打包成了一个starter,我们只需要导入starter即可,无需导入大量坐标;每个Starter包含了当前功能下的许多必备依赖坐标这些依赖坐标是项目开发,上线和运行必须的。同时这些依赖也支持依赖传递。如下Starter:

复制代码

   

        org.springframework.boot

        spring-boot-starter-web

   

spring-boot-starter-web内部封装的一些列坐标

复制代码

封装成各个Starter的好处就是让我们更加专注于业务开发,无需关心依赖导入,依赖冲突,及依赖的版本

问:为什么导入的一些Starter不需要写版本呢?

  不指定版本是因为maven有依赖传递的特性,可推测starter在父级定义了并锁定了版本;spring-boot-dependencies.xml 文件可以给大家一个答案;继承关系为 spring-boot-starter-parent.xml ==> spring-boot-dependencies.xml 这里面锁定了我们常用的坐标及Stater

编写SpringBoot项目继承spring-boot-starter-parent的好处和特点

①:默认编译Java 1.8

②:默认编码UTF-8

③:通过spring-boot-denpendencies的pom管理所有公共Starter依赖的版本

④:spring-boot-denpendencies通过Maven的依赖传递和版本锁定特性来实现版本管理

⑤:随用随取,不用继承父类所有的starter依赖。

POM文件中的Maven插件功能

复制代码

  

       

    

         org.springframework.boot

            spring-boot-maven-plugin

    

  

复制代码

补充:可选择的启动器官网介绍,需要则查询这个手册

2:自动配置(AutoConfiguration)分析

  所有我们要配置的项目Pivotal团队的开发人员,帮我们写好了,怎么实现的,主要是通过@Configuration实现 SpringBoot采用约定大于配置设计思想,将所有可能遇到的配置信息提前配置好,写在自动配置的jar包中。每个Starter基本都会有对应的自动配置。SpringBoot帮我们将配置信息写好,存放在一个jar包中:spring-boot-autoconfigure-2.4.1.jar;jar包里,存放的都是配置类,让配置类生效的"规则类"

复制代码

接下来我来介绍一个我们常见的配置类

一:找到项目的External Libraries

二:查找Maven:org.springframework.boot:spring-autoconfigue:2.4.1

三:内部有个spring-boot-autoconfigue-2.4.1.jar

四:点击org ==> web ==> servlet ==> ServletWebServerFactoryAutoConfiguration类

@Configuration(proxyBeanMethods = false)  //代表是个配置类 SpringBoot为我们提供的每个配置类都有此注解

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)

@ConditionalOnClass(ServletRequest.class)

@ConditionalOnWebApplication(type = Type.SERVLET)

@EnableConfigurationProperties(ServerProperties.class)

@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,

        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,

        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,

        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })

public class ServletWebServerFactoryAutoConfiguration { ... }

补充:我们回到之前点击META-INF ==> spring.factories 这里面配置的是SpringBoot的全部配置类

补充:我们回到之前点击META-INF ==> spring-configuration-metadata.json 这里面配置着各种配置类的信息参数

复制代码

问:SpringBoot提供这么多配置类,难道是程序运行后就全部导入吗?

  不会全部导入,只会根据当前项目的需求选择性的装配所需的配置类,这也是SpringBoot的自动装配一大特性;我们也可以设想一下,一次性装配全部配置类,那该多慢呀;

问:SpringBoot怎么知道程序运行后就自动装配呢?

  我们找到SpringBoot入口函数,点开 @SpringBootApplication 注解会发现里面有个 @EnableAutoConfiguration 这个注解就是开启自动配置的

问:开启自动装配后,它咋知道要加载指定配置呢?那么多配置类呢

  我们继续看上面的 ServletWebServerFactoryAutoConfiguration 配置类

复制代码

@Configuration(proxyBeanMethods = false)

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)

//配置类能否被自动装配主要看 @ConditionalOnClass注解

//此注解是否可以加载到一个叫 ServletRequest.class文件,一旦存在则自动装配

@ConditionalOnClass(ServletRequest.class)

@ConditionalOnWebApplication(type = Type.SERVLET)

@EnableConfigurationProperties(ServerProperties.class)

@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,

        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,

        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,

        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })

public class ServletWebServerFactoryAutoConfiguration { ... }

复制代码

  有了自动配置后,那么基本全部采用默认配置(这也就是为啥说约定大于配置的思想);那么要修改默认配置也是可以的,我们只需在配置文件配置指定的参数即可 官方全部可配置属性  如下常见配置:

复制代码

# 端口配置

server.port=8888

# 配置context-path项目访问根路径

server.servlet.context-path=/demo

# 开启debug模式,详细日志输出,用于开发的一种设置 默认是false

debug=true

# 配置日志  logging.level.{指定包下的日志}=debug

logging.level.cn.xw=debug

复制代码

四:SpringBoot的配置文件

  SpringBoot是约定大于配置的,配置都有默认值。如果想修改默认配置,可以使用application.properties或application.yml或application.yaml自定义配置。SpringBoot默认从Resource目录加载自定义配置文件。application.properties是键值对类型;application.yml是SpringBoot中一种新的配置文件方式,在使用自定义配置时名称一定要为application,因为是提前约定好的,而且三个后缀名的文件都写上是有个先后顺序,后面可覆盖前面

    **/application*.yml

    **/application*.yaml

    **/application*.properties

三种类型文件的配置方式

1:yml/yaml配置文件语法及使用

  YML文件格式是YAML(YAML Aint Markup Language)编写的文件格式。可以直观被电脑识别的格式。容易阅读,容易与脚本语言交互。可以支持各种编程语言(C/C++、Ruby、Python、Java、Perl、C#、PHP)。以数据为核心,比XML更简洁。扩展名为.yml或.yaml  官方网站  在线properties转yml

复制代码

1:大小写敏感

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

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

4:缩进不允许使用tab,只允许空格

5:缩进的空格数不重要,只要相同层级的元素左对齐即可

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

7:数组和集合使用 "-" 表示数组每个元素

复制代码

yml基本格式写法

2:配置文件与配置类属性映射

(1):java配置获取基本的配置文件信息.properties类型

基本数据获取.properties

(2):java配置获取基本的配置文件信息并注入.yml/.yaml类型

复制代码

1、使用注解@Value映射

  @value注解将配置文件的值映射到Spring管理的Bean属性值,只能映射基本数据类型

2、使用注解@ConfigurationProperties映射

  通过注解@ConfigurationProperties(prefix=''配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射。

  使用@ConfigurationProperties方式必须提供Setter方法,使用@Value注解不需要Setter方法

注:使用@ConfigurationProperties要在主函数上开启@EnableConfigurationProperties

复制代码

POJO实体类

application.yml配置文件

复制代码

//通过web的方式加载程序运行

@RestController //结合@ResponseBody 和 @Controller 两注解

@RequestMapping("/index")

public class IndexController {

    //注入

    @Autowired

    private Student student;

    @RequestMapping("/test")

    public String testMethod() {

        System.out.println(student.toString());

        //Student{

        // id=1001,

        // name='张三',

        // address='安徽六安',

        // hobbys=[baseball, basketball, volleyball],

        // score={yuwen=[66, 88], shuxue=[85, 99]},

        // teachers={yuwenTeacher=Teacher{name='张老师', message='教语文'},

        // shuxueTecher=Teacher{name='李老师', message='教数学'}}}

        return "Hello !!";

    }

}

复制代码

五:SpringBoot与其它技术集成

1:SpringBoot集成MyBatis  建表语句

  集成Mybatis完成查询全部

(1):使用注解方式完成集成

pom.xml文件

resources下的application.yml配置文件

POJO、Mapper、Service、Controller文件

注:使用http://localhost:8080/student/findAll访问,还有就是Mapper文件夹里面的代码一定要写在主函数类当前包及其子包下,如果不在则需要在入口类添加@MapperScan或者@MapperScans注解扫描一下,这个是mybatis提供的

(2):使用Mapper.xml映射完成集成

更改application.yml

在resources下创建mapper/StudentMapper.xml

删除之前在Mapper使用注解的SQL语句删除,只留方法

2:Spring Boot 集成 Redis

  springBoot集成Redis后,以上个案例的基础上做个查询学生缓存,如果第一次查询则缓存到redis服务器里,然后从redis读取数据返回到客户端

      org.springframework.boot

      spring-boot-starter-data-redis

更改StudentController

3:Spring Boot 集成定时器

   使用SpringBoot完成一个简易的定时器,每5秒输出一下当前的时间到控制台;

  首先在入口函数类上面加@EnableScheduling注解,代表开启定时器

编写定时器类

4:Spring Boot 集成Test单元测试

复制代码

    org.springframework.boot

    spring-boot-starter-test

    test

复制代码

复制代码

//@RunWith(SpringRunner.class) 在老版的SpringBoot项目需要这个

//2.2.0.RELEASE以后,springboot测试类不再需要@Runwith的注解

@SpringBootTest //注明为SpringBoot测试类

class DemomybatissApplicationTests {

    //注入StudentService对象

    @Autowired

    private StudentService studentService;

    @Test

    void contextLoads() {

        System.out.println(studentService.findAll());

    }

}

复制代码

5:Spring Boot 发送HTTP请求

  要在SpringBoot内部发送HTTP请求就得用到RestTemplate模板,它是Rest的HTTP客户端模板工具类;对基于HTTP客户端进行了封装;还实现了对象与JSON的序列化与反序列化;不限定客户端类型,目前常用的3种客户端都支持:HttpClient、OKHttp、JDK原生URLConnection(默认方式)

入口函数类更改

编写RestTemplate发送Http请求测试类

6:扩展

  SpringBoot除了上面几个集成外还集成 MongoDB、ElasticSearch、Memcached、邮件服务:普通邮件、模板邮件、验证码、带Html的邮件、RabbitMQ消息中间件、Freemarker或者Thymeleaf等等

六:SpringBoot打包部署

  启动方式有两种,一种是打成jar直接执行,另一种是打包成war包放到Tomcat服务下,启动Tomcat

1:打成Jar包部署运行

  注:pom文件里的jar必须为jar,默认就是jar

复制代码

/**

* 第一步:使用IDEA工具把写的代码通过maven的package打包

* 第二步:找到打包后的target文件夹里面,把xxx.jar包扔给测试

* 第三步:自己测试的话使用cmd执行下面命令,前提得检查自己的pom.xml文件中是否有springboot的maven插件

* java -jar  xxxx.jar

* 补充:在运行的时候传递参数 通过main函数的args接收

* java -jar  xxxx.jar --server.port=8888

* 补充:在运行的时候配置jvm参数,使占用更少的内存

* java -Xmx80m -Xms20m -jar xxxx.jar

*/

复制代码

2:打成War包部署运行

  注:pom文件里的war必须为jar,默认就是war

复制代码

创建一个类如:ServletInitializer.java,继承 SpringBootServletInitializer ,覆盖 configure(),

把启动类 Application 注册进去。外部 Web 应用服务器构建 Web Application Context 的时候,

会把启动类添加进去。

//如下代码创建的类 除了类名和注册的启动类不一样,其它是固定写法

//WEB-INF/web.xml

public class ServletInitializer extends SpringBootServletInitializer {

    @Override

    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {

        //DemoApplication是自己当前项目的主函数

        return builder.sources(DemoApplication.class);

    }

}

复制代码

七:SpringBoot热部署

  我们在之前每次写完代码之后都要重新部署运行,这样特别浪费时间,其实SpringBoot是支持热部署的,但是我们得有相对应的参数配置,导入坐标

复制代码

检查当前的pom.xml必须有此配置才可以,然后正常启动运行即可

    org.springframework.boot

    spring-boot-devtools

    runtime

    true

复制代码

当我们的代码写文运行后,后期更改了代码无需重写部署,只需要按CTRL+F9(Build Project),这是快速构建项目,或点击有上角的锤子;

如果还觉得麻烦,那就设置,一旦更改代码,IDEA失去焦点就自动构建代码,我们要设置一下IDEA配置

八:SpringBoot配置文件深入

1:多环境配置文件

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

(1):单文件的多环境配置

单个application.yml配置文件完成多环境配置  不推荐

(2):多文件的多环境配置

多文件配置多环境 推荐

(3):profile激活方式

  在上面我介绍了使用配置文件来指定配置环境:spring.profiles.active=xx;可是这个是有局限性的,除了这种方式激活还要另外2种

配置文件:  再配置文件中配置:spring.profiles.active=dev

虚拟机参数:在VM options 指定:-Dspring.profiles.active=dev

命令行参数:java –jar xxx.jar --spring.profiles.active=dev

优先级:命令行参数 > 虚拟机参数 > 配置文件

2:松散绑定

  不论配置文件中的属性值是短横线、驼峰式还是下换线分隔配置方式,在注入配置时都可以通过短横线方式取出值;使用范围:properties文件、YAML文件、系统属性

松散绑定配置文件介绍

3:配置路径及其加载顺序

4:外部配置加载顺序  官方文档

  外部加载顺序就是说在程序运行时加载外部的配置信息的顺序,如我们常用的命令行下指定额外信息 java -jar  xxx.jar --server.port=8888

中文介绍

5:修改配置文件位置及默认名称

  我们知道配置文件只能以application.yml/properties来定义,但是名称不一样是可以指定具体文件名,也可以把配置文件放入其它位置并指定都是可以的;指定的方式我以cmd下指定参数 java -jar xxx.jar  --xxx  -xxx 方式指定,或在IDEA里面指定-xxx参数

# 自定义配置文件名称

--spring.config.name=myApplication

# 指定配置文件存储位置 或 指定配置文件存储位置及配置文件名称

--spring.config.location=classpath:/myconfig/myApplication.yml

注:多个配置参数以空格隔开 --xxx -xxx

九:SpringBoot监听器

  我们知道JavaEE包括13门规范,其中Servlet规范包括三个技术点:Servlet、Listener、Filter;而本章介绍的是监听器,监听器就是监听某个对象的状态变化;SpringBoot中的监听器有很多种:如下

①:CommandLineRunner 应用程序启动完成后

②:ApplicationRunner 应用程序启动完成后

③:ApplicationContextInitializer 程序运行初始化前

④:SpringApplicationRunListener 多功能监听器

1:对开发者有益的监听器

CommandLineRunner 监听器使用

ApplicationRunner 监听器使用

2:对框架开发者有意义的监听器 功能多

ApplicationContextInitializer 监听器使用

SpringApplicationRunListener 监听器使用

使用ApplicationContextInitializer/SpringApplicationRunListener监听器必看 配置一些信息才可使用

十:自动配置实现分析

  我们在导入spring-boot-starter-web启动器无需其它配置就可以之间用,还有我们导入spring-boot-starter-data-redis启动器后可以直接使用@Autowired直接注入RedisTemplate对象,很奇怪吧,这就是SpringBoot自动配置特性,在下几节我慢慢引入

1:@Import注解进阶

  当我们需要导入某个类到spring容器中去,但spring恰好无法扫描到这个类,而我们又无法修改这个类(jar包形式)。我们就可以通过@import(xxx.class)是将这个类导入到spring容器中

(1):直接导入

复制代码

//配置类  springConfig

@Configuration

@Import(value={DateConfig.class})  //直接导入

public class SpringConfig { }

//普通类,里面有个@Bean注入方法  DateConfig

//被任何一个配置类引用,当前自己类也变为子配置类

public class DateConfig {

    //创建时间对象放入容器

    @Bean

    public Date createDate() { return new Date(); }

}

复制代码

(2):通过配置类导入

复制代码

@Configuration

public class SpringConfig {

    //创建时间对象放入容器

    @Bean

    public Date createDate() { return new Date(); }

}

@SpringBootApplication

@Import(value={SpringConfig.class}) //导入配置类

public class LintenerDemoApplication {

    public static void main(String[] args) {

        ConfigurableApplicationContext run = SpringApplication.run(LintenerDemoApplication.class, args);

        //打印时间对象

        System.out.println(run.getBean(Date.class));

    }

}

复制代码

(3):通过ImportSelector接口实现类导入  高级方式

使用ImportSelector接口

2:@Configuration注解进阶

  相对这个注解大家肯定不陌生,只要是Spring注解配置类都有这玩意;其实只要添加@Configuration注解的类里面可以衍生出各种条件注解供我们使用,前提只能在注解类下使用,它就是@Conditional条件注解,这个条件注解又衍生出各种详细的条件注解

注:@EnableAutoConfiguration 其本质是 @Import 和 @Configuration的组合

复制代码

一:class类条件

    @ConditionalOnClass == 存在指定类条件

    @ConditionalOnMissingClass == 不存在指定类条件

二:属性条件

    @ConditionalOnProperty == 属性条件,还可以为属性设置默认值

三:Bean条件

    @ConditionalOnBean == 存在Bean条件

    @ConditionalOnMissingBean == 不存在Bean条件

    @ConditionalOnSingleCondidate == 只有一个Bean条件

四:资源条件

    @ConditionalResource == 资源条件

五:Web应用条件

    @ConditionalOnWebApplication == web应用程序条件

    @ConditionalOnNotWebApplication == 不是web应用程序条件

六:其他条件

    @ConditionalOneExpression == EL表达式条件

    @ConditionalOnJava == 在特定的Java版本条件

复制代码

  @Configuration还有一些加载顺序的方式

1:@AutoConfigureBefore==在那些自动配置之前执行

2:@AutoConfigureAfter==在那些自动配置之后执行

3:@AutoConfigureOrder==自动配置顺序

(1):@ConditionalOnClass  与 @ConditionalOnProperty 介绍

复制代码

@ConditionalOnClass注解属性介绍

    Class[] value():以类的class形式的数组

    String[] name():以类的全路径名的字符串数组

@ConditionalOnProperty注解属性介绍

    value 和 name:数组,获取对应property名称的值,它们只能存在其中一个

    prefix:配置属性名称的前缀,比如spring.http.encoding

    havingValue:可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置

    matchIfMissing:缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效

复制代码

案例讲解注解

RedisTemplate自动注入分析

USB Microphone https://www.soft-voice.com/

Wooden Speakers  https://www.zeshuiplatform.com/

亚马逊测评 www.yisuping.cn

深圳网站建设www.sz886.com

你可能感兴趣的:(SpringBoot入门及深入)