导图社区 SpringBoot总结
SpringBoot的知识点总结,有助于帮助您熟悉知识要点,加强记忆。有需要的同学,可以收藏下哟。
编辑于2022-03-30 23:54:40SpringBoot
1. 什么是SpringBoot
Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用Spring 的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手
2. 为什么要用SpringBoot
快速开发,快速整合,配置简化、内嵌服务容器
3. Spring Boot 有哪些优点
1. 容易上手,提升开发效率,为 Spring 开发提供一个更快、更简单的开发框架
2. 开箱即用,远离繁琐的配置
3. 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等
4. SpringBoot总体就是使编码变简单、配置变简单、部署变简单、监控变简单等等
4. SpringBoot的缺点
1. 依赖太多,一个spring boot项目就有很多Maven
2. 缺少服务的注册和发现等解决方案
3. 缺少监控集成方案,安全管理方案
4. 将原有的spring项目转成springboot项目,很困难,更适合新建的项目
5. 集成度很高,对于了解底层不容易
5. SpringBoot的特征
1. 创建独立的Spring应用程序
SpringBoot可以jar包的形式进行独立的运行,使用:java -jar xx.jar就可以成功运行项目,或者在项目的主程序中运行main函数
2. 直接嵌入Tomcat,Jetty或Undertow(无需部署WAR包)
Spring 项目部署时需要我们在服务器上部署 tomcat,然后把项目打成 war 包扔到 tomcat里springboot项目不需要单独下载Tomcat等传统服务器,内嵌容器,使得我们可以执行运行项目的主程序main函数,并让项目的快速运行,另外,也降低对运行环境的基本要求,环境变量中有JDK即可。
3. 提供 starter 简化 Maven 配置
Spring Boot提供了一系列的starter pom用来简化我们的Maven依赖,通过这些starter项目就能以Java Application的形式运行Spring Boot项目,而无需其他服务器配置
4. 尽可能自动配置Spring和3rd Party库
Spring Boot提供Spring框架的最大自动化配置,大量使用自动配置,使得开发者对Spring的配置尽量减少Spring Boot更多的是采用 Java Config 的方式,对 Spring 进行配置
5. 提供生产就绪型功能,例如指标,运行状况检查和外部化配置
Spring Boot提供了基于http、ssh、telnet对运行时的项目进行监控;我们可以引入 spring-boot-start-actuator 依赖,直接使用 REST 方式来获取进程的运行期性能参数,从而达到监控的目的,比较方便。但是 Spring Boot 只是个微框架,没有提供相应的服务发现与注册的配套功能,没有外围监控集成方案,没有外围安全管理方案,所以在微服务架构中,还需要 Spring Cloud 来配合一起使用。
6. 完全没有代码生成,也不需要XML配置
Spring Boot 的神奇的不是借助于代码生成来实现的,而是通过条件注解来实现的,这是 Spring 4.x 提供的新特性。Spring 4.x 提倡使用 Java 配置和注解配置组合,而 Spring Boot 不需要任何 xml 配置即可实现 Spring 的所有配置。
6. SpringBoot与SpringCloud 区别
SpringBoot是快速开发的Spring框架,SpringCloud是完整的微服务框架,SpringCloud依赖于SpringBoot
7. 如何快速构建一个SpringBoot项目
TODO待重新回答
1. 通过浏览器访问http://start.spring.io
2. 通过Spring Tool Suite使用
3. 通过IntelliJ IDEA使用
4. 使用Spring Boot CLI使用
8. 什么是yaml
YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比如果我们想要在配置文件中添加复杂的属性,YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据
9. SpringBoot支持配置文件的格式
1. properties
java.xiaokaxiu.name=xiaoka
2. yml
java: xiaokaxiu: name: xiaoka
10. SpringBoot启动方式
1. main方法(开发调试阶段)
2. 打包用命令或者放到容器中运行命令行 java -jar 的方式(现网)
3. mvn/gradle
在pom.xml文件所在的位置,输入 mvn spring-boot:run
11. SpringBoot需要独立的容器运行
不需要,内置了 Tomcat/Jetty
TODO如何内置的
12. 在 Spring Boot 里面,可以使用哪几种方式来加载配置
1. properties文件
2. YAML文件
3. 系统环境变量
4. 命令行参数等等
13. SpringBoot配置属性加载的顺序
这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。
1. 命令行参数
2. java:comp/env里的JNDI属性
3. JVM系统属性
4. 操作系统环境变量
5. 随机生成的带random.*前缀的属性
(在设置其他属性时,可以引用它们,比如${random.long})
6. 应用程序以外的application.properties或者appliaction.yml文件
由jar包外向jar包内进行寻找;优先加载带profile,6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件再来加载不带profile的配置文件8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
7. 打包在应用程序内的application.properties或者appliaction.yml文件
8. 通过@PropertySource标注的属性源
9. 默认属性
14. 什么是SpringProfiles
一般来说我们从开发到生产,经过开发(dev)、测试(test)、上线(prod)。不同的时刻我们会用不同的配置。Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册 bean。它们可以让我们自己选择什么时候用什么配置。
15. 不同的环境的配置文件
可以是 application-{profile}.properties/yml ,但默认是启动主配置文件application.properties,一般来说我们的不同环境配置如下。
`application.properties`:主配置文件`application-dev.properties`:开发环境配置文件`application-test.properties`:测试环境配置文件`application-prop-properties`:生产环境配置文件
16. 如何激活某个环境的配置
比如我们激活开发环境。properties: spring.profiles.active=dev 命令行:java -jar zekun-v1.0.jar --spring.profiles.active=dev
17. application.properties和application.yml文件可放位置?优先级?
1. 外置,在相对于应用程序运行目录的/config子目录里(–file:./config/)
2. 外置,在应用程序运行的目录里(–file:./)
3. 内置,在config包内(–classpath:/config/)
4. 内置,在Classpath根目录(–classpath:/)
我们还可以通过spring.config.location来改变默认的配置文件位置项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
优先级由高到底,高优先级的配置会覆盖低优先级的配置;SpringBoot会从这四个位置全部加载主配置文件;互补配置
18. SpringBoot如何修改端口号
1. yml中
server : port : 8888
2. properties
server.port=8888
3. 命令
java -jar zekun.jar ——server.port=8888或java -Dserver.port=8888 -jar zekun.jar
19. 「bootstrap.yml」 和「application.yml」
bootstrap.yml 优先于application.yml
20. SpringBoot热部署方式
TODO实现方式待注释
1. spring-boot-devtools
2. Spring Loaded
3. Jrebel
4. 模版热部署
21. SpringBoot如何兼容Spring项目
在启动类加:@ImportResource(locations = {"classpath:spring.xml"})
22. 获得Bean装配报告信息访问哪个端点
/beans 端点
23. 关闭应用程序访问哪个端点
/shutdown 该端点默认是关闭的,如果开启,需要如下设置
endpoints: shutdown: enabled: true
24. 查看发布应用信息访问哪个端点
/info
25. 针对请求访问的几个组合注解
1. @PatchMapping 负责部分更新,客户端提供要更新的那些字段(部分字段)
2. @PostMapping 创建单个资源 一般向“资源集合”型uri发起
3. @GetMapping 查询
4. @PutMapping 更新单个资源(全量),客户端提供完整的更新后的资源(可以理解为所有字段)
5. @DeleteMapping 删除
26. 开启SpringBoot特性的几种方式
1. 继承spring-boot-starter-parent项目
2. 导入spring-boot-dependencies项目依赖
27. SpringBoot 中的starter
可以理解成对依赖的一种合成,starter会把一个或一套功能相关依赖都包含进来,避免了自己去依赖费事,还有各种包的冲突问题。大大的提升了开发效率。并且相关配置会有一个默认值,如果我们自己去配置,就会覆盖默认值。
28. SpringBoot Starter的工作原理
在sprinBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建为spring容器中的bean,并且进行自动配置把bean注入SpringContext中 //(SpringContext是Spring的配置文件)
29. SpringBoot配置监控
引入spring-boot-starter-actuator依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
30. SpringBoot集成Mybatis
mybatis-spring-boot-starter
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.1.1</version></dependency>
31. SpringBoot启动类注解或核心注解?它是由哪些注解组成
@SpringBootApplication
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能
配置文件的路径是当前根目录(src/main/resources/application.yml等)
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项
例如: java 如关闭数据源自动配置功能:@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })。
TODO自动配置流程
该注解引入了AutoConfigurationImportSelector,该类中的方法会扫描所有存在META-INF/spring.factories的jar包
@ComponentScan:Spring组件扫描
扫描范围默认状况下是启动类所在的同名包及其子包
32. SpringBoot的自动配置原理是什么
1. 主要是Spring Boot的启动类上的核心注解SpringBootApplication注解主配置类,有了这个主配置类启动时就会为SpringBoot开启一个@EnableAutoConfiguration注解自动配置功能。
2. 而这个注解也是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包(从配置文件META_INF/Spring.factories加载可能用到的自动配置类)
3. 去重,并将exclude和excludeName属性携带的类排除
4. 过滤,将满足条件(@Conditional)的自动配置类返回
33. Async异步调用方法
在SpringBoot中使用异步调用是很简单的,只需要在方法上使用@Async注解即可实现方法的异步调用。 注意:需要在启动类加入@EnableAsync使异步调用@Async注解生效
34. 编写测试用例的注解
@SpringBootTest
35. SpringBoot异常处理相关注解
1. @ControllerAdvice
2. @ExceptionHandler
控制器通知 (@ControllerAdvice 或 @RestControllerAdvice),它将所有控制器作为一 个切面,利用切面技术来实现。组合可以拦截所有控制器发生的异常,可以处理除“404”以外的运行异常
/** * 自定义业务异常 * 注意:如果继承的是Exception类,那么Spring的事务管理将会失效, * 只有继承RuntimeException类才使Spring的事务管理不会失效 **/public class BusinessException extends RuntimeException{ private String errorMessage; //异常信息 public BusinessException(String errorMessage) { super(errorMessage); this.errorMessage = errorMessage; } public String getErrorMessage() { return errorMessage; } public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; }}import org.apache.logging.log4j.LogManager;import org.apache.logging.log4j.Logger;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.servlet.ModelAndView; /** * 全局异常处理器 **/@ControllerAdvicepublic class BusinessExceptionHandler{ //日志对象 private Logger logger = LogManager.getLogger(BusinessExceptionHandler.class); /** * 自定义业务异常处理 */ @ExceptionHandler(BusinessException.class) public ModelAndView businessExceptionHandler(BusinessException ex) { //错误信息 String errorMessage = ex.getErrorMessage(); //记录异常日志 logger.error("[业务异常]" + errorMessage); //返回错误页面 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("errorMessage",errorMessage); modelAndView.setViewName("error.html"); return modelAndView; }}/** * 获取博客信息 */@RequestMapping("/blogInfo")public String blogInfo(Date date,Model model){ boolean isException = true; if(isException) { throw new BusinessException("这是自定义异常信息"); } model.addAttribute("date",date); return "blog-info.html";}
36. SpringBoot读取配置相关注解有
1. @PropertySource读取自定义的配置文件中定义的属性
使用方式:@PropertySource(value={classpath:/指定配置文件名称}) 该注解加在类上@Data@AllArgsConstructor@NoArgsConstructor@Component@PropertySource(value={"classpath:/user.properties"})public class User { @Value("${user.username}") private String username;//csp1999 @Value("${user.password}") private String password;//123456 @Value("${user.age}") private int age;//22}
2. @Value
@Value("${user.username}")private String userName;
3. @Environment
引入配置文件的值时,只要直接将Environment类引入即可 @Autowired private Environment environment; @RequestMapping(value="/environment",method=RequestMethod.GET) public String environmentTest() { String value=environment.getRequiredProperty("user.username")+" " +environment.getRequiredProperty("user.sex")+" "+environment.getRequiredProperty("user.age"); System.out.println(value); return value; }
4. @ConfigurationProperties读取默认配置文件中定义的属性但是可以指定属性前缀
使用@ConfigurationProperties注解来进行配置文件的注入时,需要定义一个配置类@Data@Configuration@ConfigurationProperties(prefix="user")public class PropertiesConfig { private String userName; private String sex; private Integer age;}// prefix---指定配置项中的前缀注意:1、使用@ConfigurationProperties的配置类中@Configuration注解不能少,因为@ConfigurationProperties在项目加载的时候并不能够将配置类作为bean添加到Spring的容器中。2、如果不想在配置类中使用@Configuration注解,也可以用其他的形式,如在项目的启动类中添加@EnableConfigurationProperties(value= {PropertiesConfig.class})一样可以达到bean注入的效果。<!-- 个人版本踩坑: 不加这个依赖的话,当在配置类中 使用@ConfigurationProperties(prefix = "xxx")注解时, 我这个版本的spring boot会提示有问题--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artif <optional>true</optional></dependency>
5. @EnableConfigurationProperties
@ConfigurationProperties 和 @EnableConfigurationProperties 配合使用@Data//@Component // 未将DemoConfig1 交给IOC管理@ConfigurationProperties(prefix = "csp.user2")public class DemoConfig1 { private String username1; private String password1;}@Service // 或者@Configuration/@Componet/@Controller/@Repository 只需要交给IOC管理即可@EnableConfigurationProperties({ DemoConfig1.class})public class TestService{ @Autowired private DemoConfig1 demoConfig1; @Autowired private DemoConfig2 demoConfig2;}
37. 如何在 Spring Boot 启动的时候运行一些特定的代码
可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法
SpringBoot应用启动成功以后就会callRunners方法,方法中调用ApplicationRunner和CommandLineRunner接口的run方法,只在启动成功以后调用一次。所以,在这基础上就可以实现相当于开机自启的一个操作,具体执行的逻辑代码就看在应用启动后需要做什么事情了,比如初始化一些数据实现CommandLineRunner接口,重写run方法,方法参数是原始args参数实现ApplicationRunner接口,重写run方法,方法参数是ApplicationArguments,解析封装过后的args参数
38. SpringBoot 1.x 和 2.x区别
配置变更JDK 版本升级第三方类库升级响应式 Spring 编程支持HTTP/2 支持配置属性绑定更多改进与加强
1. SpringBoot 2基于Spring5和JDK8,Spring 1x用的是低版本
2. 配置变更,参数名等
3. SpringBoot2相关的插件最低版本很多都比原来高
4. 2.x配置中的中文可以直接读取,不用转码
5. Actuator的变化
6. CacheManager 的变化
39. SpringBoot支持哪些日志框架,推荐和默认的日志框架是哪个
TODO日志框架集成
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架,但是不管是那种日志框架他都支持将日志信息输出到控制台或者文件中
40. SpringBoot支持什么前端模板
thymeleaf,freemarker,jsp,官方不推荐JSP会有限制
41. 什么是 JavaConfig
Spring JavaConfig 是 Spring 社区的产品,Spring 3.0引入了他,它提供了配置 Spring IOC 容器的纯Java 方法。因此它有助于避免使用 XML 配置
42. 使用 JavaConfig 的优点
1. 面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@Bean 方法等。
2. 减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。但是,许多开发人员不希望在 XML 和 Java 之间来回切换。JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将JavaConfig 与 XML 混合匹配是理想的。
3. 类型安全和重构友好。JavaConfig 提供了一种类型安全的方法来配置 Spring容器。由于 Java5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean,不需要任何强制转换或基于字符串的查找。
43. 常用的Java config
1. @Configuration:在类上打上写下此注解,表示这个类是配置类
2. @ComponentScan:在配置类上添加 @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan >
3. @Bean:bean的注入:相当于以前的< bean id="objectMapper"class="org.codehaus.jackson.map.ObjectMapper" />
4. @EnableWebMvc:相当于xml的<mvc:annotation-driven >
5. @ImportResource
6. @ImportResource:相当于xml的< import resource="applicationContext-cache.xml">