Springboot 总结

一、什么是 SpringBoot?

    描述:SpringBoot 是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目。大多数 SpringBoot 项目只需要很少的配置文件。convention over configuration 约定大于配置,去繁从简

Spring Boot Reference Guide

https://docs.spring.io/spring-boot/docs/2.1.2.RELEASE/reference/htmlsingle/#using-boot-starter

二、SpringBoot 核心功能

    1. 独立运行 Spring 项目

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

    2. 内嵌 Servlet 容器

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

    3. 提供 starter 简化 Maven 配置

        Spring 提供了一系列的 start pom 来简化 Maven 的依赖加载。

    4. 自动装配 Spring

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

    5. 准生产的应用监控

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

    6. 无代码生产和 xml 配置

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

三、SpringBoot 的优缺点

    优点:

            ① 快速构建项目

            ② 对主流开发框架的无配置集成。

            ③ 项目可独立运行,无须外部依赖 Servlet 容器。

            ④ 提供运行时的应用监控。

            ⑤ 极大的提高了开发、部署效率。

            ⑥ 与云计算的天然集成。

            ⑦ Springboot 使编码变简单,使配置变简单,使部署变简单,使监控变简单。

    缺点:

            ① 集成度较高,使用过程不太容易了解底层。

            ② 新技术坑多,文档较少。

四、SpringBoot 特性

    ① 创建独立的 Spring 项目

    ② 内置 Tomcat 和 Jetty 容器

    ③ 提供一个 starter poms 来简化 Maven 配置

    ④ 提供了一系列大型项目中常见的非功能性特性,如安全、指标、健康监测、外部配置等

    ⑤ 完全没有代码生成和 xml 配置文件

五、SpringBoot 快速搭建

    https://start.spring.io/

六、SpringBoot CLI

    SpringBoot CLI 是 SpringBoot 提供的控制台命令工具。

七、SpringBoot Maven 构建项目

    spring-boot-starter-parent:是一个特殊 start,它用来提供相关的 Maven 依赖项,使用它之后,常用的包依赖可以省去 version 标签。

八、SpringBoot 几个常用的注解

    ① @RestController 和 @Controller 指定一个类,作为控制器的注解

    ② @RequestMapping 方法级别的映射注解。

    ③ @EnableAutoConfiguration 和 @SpringBootApplication 是类级别的注解,根据 maven 依赖的 jar 来自动猜测完成正确的 spring 的对应配置,只要引入了 spring-boot-starter-web 的依赖,默认会自动配置 Spring MVC 和Tomcat 容器。

        @SpringBootApplication 注解 == @Configuration + @EnableAutoConfiguration + @Compon.entScan 三个注解

    ④ @Configuration 类级别的注解,一般这个注解,我们用来标识 main 方法所在的类,完成元数据bean 的初始化。

    ⑤ @ComponentScan 类级别的注解,自动扫描加载所有的Spring 组件包括Bean 注入,一般用在 main 方法所在的类上。

    ⑥ @ImportResource 类级别的注解,当我们必须使用一个 xml 的配置时,使用 @ImportResource 和 @Configuration 来标识这个文件资源的类。

    ⑦ @Autowired 注解,一般结合 @ComponentScan 注解,来自动注入一个 Service 或 Dao 级别的 Bean。

    ⑧ @Component 类级别注解,用来标识一个组件,比如 我自定义一个 Filter,则需要此注解标识之后,Springboot 才会正确识别。

SpringBoot 依赖库:

    spring-boot-starter-web:支持全栈 web 开发,里面包括了 Tomcat 和 Spring-webmvc。

    spring-boot-starter-mail:提供对 javax.mail 的支持。

    spring-boot-starter-ws:提供对 Spring Web Services 的支持。

    spring-boot-starter-test:提供对常用测试框架的支持,包括 Junit、Hamcrest 以及 Mockito 等。

    spring-boot-starter-actuator:支持产品环境下的一些功能,比如 指标度量及监控等。

    spring-boot-starter-jetty:支持 jetty 容器。

    spring-boot-starter-log4j:引入默认的 log 框架 (logback)

     <parent>

          <groupId>org.springframework.boot</groupId>

          <artifactId>spring-boot-starter-parent</artifactId>

          <version>2.1.1.RELEASE</version>

          <relativePath /> <!-- lookup parent from repository -->

     </parent>

     <properties>

          <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

          <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

          <java.version>1.8</java.version>

     </properties>

     <dependencies>

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-starter</artifactId>

          </dependency>

          <!-- Springboot 核心组件 -->

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-starter-web</artifactId>

          </dependency>

          <!-- Springboot 测试组件 -->

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-starter-test</artifactId>

              <scope>test</scope>

          </dependency>

          <!-- Springboot jsp 的支持 -->

          <dependency>

              <groupId>org.apache.tomcat.embed</groupId>

               <artifactId>tomcat-embed-jasper</artifactId>

              <scope>provided</scope>

          </dependency>

          <!-- Thymeleaf -->

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-starter-thymeleaf</artifactId>

          </dependency>

          <!--引入JPA的依赖关系 -->

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-starter-data-jpa</artifactId>

          </dependency>

          

          <!-- Springboot lombok 支持 -->

          <dependency>

              <groupId>org.projectlombok</groupId>

              <artifactId>lombok</artifactId>

          </dependency>

          <!-- SpringBoot 外部tomcat支持 -->

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-starter-tomcat</artifactId>

          </dependency>

          <!-- Springboot - log4j -->

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-starter-log4j</artifactId>

              <version>1.3.8.RELEASE</version>

          </dependency>

          <!-- 热部署 开发者模式 -->

          <dependency>

              <groupId>org.springframework.boot</groupId>

               <artifactId>spring-boot-devtools</artifactId>

              <optional>true</optional>

          </dependency>

     </dependencies>

     <build>

          <plugins>

              <plugin>

                   <groupId>org.springframework.boot</groupId>

                   <artifactId>spring-boot-maven-plugin</artifactId>

                   <configuration>

                       <fork>true</fork>

                   </configuration>

              </plugin>

          </plugins>

     </build>

    SpringBoot 项目结构:

            resources 文件目录结构:

                static 文件夹:保存所有的静态文件,js、css、images

                templates 文件夹:保存所有的模板页面

                application.properties:SpringBoot 的默认配置文件

                一般可在 SpringBoot 的核心配置文件中添加 SpringMVC的视图解析:

                    spring.mvc.view.prefix = /templates/views/

                    spring.mvc.view.suffix = .html

热部署原理: 使用类加载器(classloader 重新读取字节码文件到 jvm 内存

如何纯手写一个热部署功能:

    1. 监听 class 文件是否有发生改变—— 版本号 或者 修改时间

    2. 如果 class 文件发生改变的,就使用 classloader 进行重新读取。

热部署可以用于在生产环境吗?

    1. 理论上是可以的(但是不推荐)—— 不安全

    2. 一般用于在本地开发(eclipse) ,为了本地测试能够提高效率,但是生产环境绝对不可以使用

热部署的应用场景:本地开发,提高运行效率,不需要重启服务器。

热部署的缺点:如果项目比较大的情况,非常卡。—— 比较占内存。

    <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-devtools</artifactId>

            <optional>true</optional>

            <scope>true</scope>

    </dependency>

常见面试题:

1. 常见的 starter 会包括几个方面的内容?分别是什么?

    答:① 自动配置文件,根据 classpath 是否存在指定的类来决定是否要执行该功能的自动配置。

           ② spring.factories,指导 SpringBoot 找到指定的 自动配置文件。

           ③ endpoint:可以理解为一个 admin,包含对服务的描述、界面、交互(业务信息的查询)。

           ④ health indicator:该 starter 提供的服务的健康指标。

        两个需要注意的点:

            1. @ConditionalOnMissingBean 的作用是:只有对应的 bean 在系统中都没有被创建,它修饰的初始化代码块才会执行,【用户自己手动创建的 bean 优先】

            2. Spring Boot Starter 找到自动配置文件(xxxxAutoConfiguration 之类的文件)的方式有两种:

                ① spring.factories:由 SpringBoot  触发探测 classpath 目录下的类,进行自动配置;

                ② EnableXxxxx:有时需要由 starter 的用户触发,查找自动配置文件的过程

2. 总结 Spring Boot Starter 的工作原理:

    答:1. SpringBoot 在启动时扫描项目所依赖的 JAR 包,寻找包含 spring.factories 文件的 JAR。

           2. 根据 spring.factories 配置加载 AutoConfigure 类

           3. 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context。

3. 自定义 Springboot-starter 注意事项

    答:1. SpringBoot 默认 scan 的包名是 其 main 类所在的 包名,如果引入的 starter 包名不一样,需要自己添加 scan。

               @ComponentScan(basePackages={"com.darryl.demo","com.darryl.sms"})

           2. 对于 starter 中有 feign 的,需要额外指定

               @EnableFeignClients(basePackages={"com.darryl.sms"})

           3. 对于 exclude 一些 autoConfig

                @EnableAutoConfiguration(exclude={MetricFilterAutoConfiguration.class})

4. 什么是 SpringBoot

    答:用来简化 Spring 应用的初始搭建以及开发过程,使用特定的方式来进行配置(properties 或 yml 文件),

            创建独立的 Spring 引用程序,main方法运行

            嵌入的 Tomcat,无需部署 war 文件,

            简化 Maven 配置

            自动配置 Spring 添加对应功能 starter 自动化配置

5. SpringBoot 常用的 starter 有哪些

    答:spring-boot-starter-web 嵌入 Tomcat 和 web 开发需要 Servlet 与 jsp 支持,

           spring-boot-starter-data-jpa   数据库支持

           spring-boot-starter-data-redis  redis 数据库支持

           spring-boot-starter-data-solr    solr 支持

           mybatis-spring-boot-starter     第三方的 mybatis 集成 starter

6. SpringBoot 自动配置的原理

    答:在 Spring 程序 main 方法中,添加 @SpringBootApplication 或者 @EnableAutoConfiguration 会自动去 Maven 中读取每个 starter 中的 spring.factories 文件,该文件里配置了所有需要被创建 Spring 容器中的 bean

7. SpringBoot 读取配置文件的方式

    答:SpringBoot 默认读取配置文件为 application.properties 或者是 application.yml

8. SpringBoot 集成 MyBatis 的过程

    答:添加 MyBatis 的 starter maven 依赖

            <dependency>

                    <groupId>org.mybatis.spring.boot</groupId>

                    <artifactId>mybatis-spring-boot-starter</artifactId>

                    <version>1.2.0</version>

            </dependency>

            在 MyBatis 的接口中 添加 @Mapper 注解

            在 application.yml 配置数据源信息

9. @EnableAutoConfiguration 注解的作用

   答:从 classpath 中搜索所有 META-INF/spring.factories 配置文件,然后将其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration key 对应的配置项加载到 Spring容器中。

10. 热部署原理与热加载区别是什么

    答:部署方式

                热部署在服务器运行时重新部署项目

                热加载在运行时重新加载 class

          实现原理

                热部署直接重新加载整个应用

                热加载在运行时重新加载 class

          使用场景

                热部署更多的是在生产环境使用

                热加载则更多的是在开发环境使用

11. SpringBoot 执行流程

    ① 开始请求

    ② 收集各种条件和回调接口

    ③ 通知 started()

    ④ 创建并准备 Environment

    ⑤ 通告 EnvironmentPrepared()

    ⑥ 创建并初始化 ApplicationContext

    ⑦ 通告 contextPrepare(),通告 contextLoaded()

    ⑧ 调用 ApplicationContext 的 refresh()方法,完成最终程序启动

    ⑨ 执行 ApplicationRunner 和 CommandlineRunner 通告 finished()

    ⑩ 结束

12. 如何实现 SpringBoot 应用程序的 安全性

    答:为了实现 SpringBoot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需很少的代码。配置类将必须扩展 WebSecurityConfigurerAdapter 并覆盖其方法。

13. 如何集成 SpringBoot 和 ActiveMQ

    答:对于集成 SpringBoot 和 ActiveMQ,我们使用 spring-boot-starter-activemq 依赖关系。它只需要很少的配置,并且不需要=样板代码。

14. 如何使用 SpringBoot 实现分页和排序?

    答:使用 SpringBoot 实现分页非常简单。使用 Spring Data-JPA 可以实现将可分页的 org.springframework.data.domain.Pageable 传递给存储库方法。

15. 什么是 Spring Boot Starter

    答:启动器是一套方便的依赖描述符,它可以放在自己的程序中。可以一站式的获取你所需要的 Spring 和 相关技术,而不需要依赖描述符的通过示例代码搜索和复制黏贴的负载。

            

猜你喜欢

转载自blog.csdn.net/Darryl_Tang/article/details/87996273