1. 什么是springboot ?
- 用来简化spring应用的初始搭建以及开发过程,使用特定的方式来进行配置(properties或yml文件)
- 嵌入的Tomcat 无需部署war文件到tomcat
- 简化maven配置
- 自动配置spring添加对应功能starter自动化配置
spring boot来简化spring应用开发,约定大于配置,去繁从简
2. Springboot 有哪些优点?
- 快速创建独立运行的spring项目与主流框架集成
- 使用嵌入式的tomcat,应用无需打包成war包
- starters自动依赖与版本控制
- 大量的自动配置,简化开发,也可修改默认值
- springcloud基于springboot开发
3. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:
- @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
- @ComponentScan:Spring组件扫描。
4. SpringBoot四大核心是什么?
- 自动装配:autoConfiguration
- 起步依赖:Spring Boot Starter
- Actuator:Spring Boot的监控插件,本身提供了很多接口可以获取当前项目的各项运行状态指标。
- springboot CLI:命令行界面
5. (重点) 说说SpringBoot自动装配原理?
SpringBoot 的核心注解是@SpringApplication 注解
在 @SpringApplication 的源码里面,有三个关键的注解:
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration
三个注解共同完成自动装配;
@SpringBootConfiguration:注解标记启动类为配置类
@ComponentScan:注解实现启动时扫描启动类所在的包以及子包下所有标记为bean的类由IOC容器注册为bean
@EnableAutoConfiguration通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过AutoConfigurationImportSelector 类的 selectImports 方法去读取需要被自动装配的组件依赖下的spring.factories文件配置的组件的类全名,并按照一定的规则过滤掉不符合要求的组件的类全名,将剩余读取到的各个组件的类全名集合返回给IOC容器并将这些组件注册为bean
6. 如何理解Spring Boot中的Starter?
Starter是Spring Boot的四大核心功能特性之一,除此之外,Spring Boot还有自动装配、Actuator监控等特性。
Spring Boot里面的这些特性,都是为了让开发者在开发基于Spring生态下的企业级应用时,只需要关心业务逻辑,减少对配置和外部环境的依赖。
其中,Starter是启动依赖,它的主要作用有几个:
- Starter组件以功能为纬度,来维护对应的jar包的版本依赖,使得开发者可以不需要去关心这些版本冲突这种容易出错的细节。
- Starter组件会把对应功能的所有jar包依赖全部导入进来,避免了开发者自己去引入依赖带来的麻烦。
- Starter内部集成了自动装配的机制,也就说在程序中依赖对应的starter组件以后,这个组件自动会集成到Spring生态下,并且对于相关Bean的管理,也是基于自动装配机制来完成。
- 依赖Starter组件后,这个组件对应的功能所需要维护的外部化配置,会自动集成到Spring Boot里面,我们只需要在application.yml文件里面进行维护就行了,比如Redis这个starter,只需要在application.yml文件里面添加redis的连接信息就可以直接使用了。
Starter组件几乎完美的体现了Spring Boot里面约定优于配置的理念。
Spring Boot官方提供了很多的Starter组件,比如Redis、JPA、MongoDB等等。
但是官方并不一定维护了所有中间件的Starter,所以对于不存在的Starter,第三方组件一般会自己去维护一个。
官方的starter和第三方的starter组件,最大的区别在于命名上。
官方维护的starter的以spring-boot-starter开头的前缀。
第三方维护的starter是以spring-boot-starter结尾的后缀。
7. SpringBoot Starter的工作原理?
SpringBoot就是由各种Starter组合起来的,我们自己也可以开发Starter,在sprinBoot启动时由@SpringBootApplication注解会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建spring容器中的bean,并且进行自动配置把bean注入SpringContext中 //(SpringContext是Spring的配置文件)
8.如何自定义SpringBoot Starter?
命名规范:官方的starter是以spring-boot-starter-xxx,自定义的stater 是以xxx-spring-boot-starter,我们应该遵循这个规定。
第一步:定义一个配置类。使用@ConfigurationProperties注解并指定prefix 前缀,这个注解将会把application.yml里面的配置文件内容映射到配置类中。
第二步:定义一个自动配置类。使用@EnbaleConfigurationProperties注解可以将之前的配置类注入到spring容器中。可以同时使用@ConditionalOnProperty或者@ConditionalOnClass注解来增加配置类的生效条件。在自动配置类中,可以自定义一些Bean。
第三步:注册自动配置类:在resource 目录下,新建一个spring.factories.xml key是org.springframework.boot.autoconfigure.EnableAutoConfiguration,value是刚才自定义的自动配置类的全路径。
第四步:mvn install 将jar包打包到本地,然后就可以在项目中应用该jar包。
9. springboot常用的starter有哪些?
- spring-boot-starter-web嵌入tomcat和web开发需要servlet与jsp支持
- spring-boot-starter-data-jpa数据库支持
- spring-boot-starter-data-redis redis数据库支持
- mybatis-spring-boot-starter第三方的mybatis集成starter
10. SpringBoot实现热部署有哪几种方式?
主要有两种方式:
- Spring Loaded
- Spring-boot-devtools
11. Spring Boot的核心配置文件有哪几个?它们的区别是什么?
Spring Boot的核心配置文件是application和bootstrap配置文件。
application配置文件这个容易理解,主要用于Spring Boot项目的自动化配置。
bootstrap配置文件有以下几个应用场景:
- 使用Spring Cloud Config配置中心时,这时需要在bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性;
- 一些加密/解密的场景
12.Spring Boot、Spring MVC 和 Spring 有什么区别?
Spring
Spring是一个开源容器框架,可以接管web层,业务层,dao层,持久层的组件,并且可以配置各种bean,和维护bean与bean之间的关系。其核心就是控制反转(IOC),和面向切面(AOP),简单的说就是一个分层的轻量级开源框架。
SpringMVC
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC是一种web层mvc框架,用于替代servlet(处理|响应请求,获取表单参数,表单校验等。SpringMVC是一个MVC的开源框架,SpringMVC=struts2+spring,springMVC就相当于是Struts2加上Spring的整合。
- SpringBoot
Springboot是一个微服务框架,延续了spring框架的核心思想IOC和AOP,简化了应用的开发和部署。Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。
13. 如何使用Spring Boot实现异常处理?
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = NameException.class) public Object nameExceptionHandler(Model model, HttpServletRequest req, NameException ex) { } @ExceptionHandler(value = PasswordException.class) public Object passwordExceptionHandler(Model model, HttpServletRequest req, PasswordException ex) { //这里可以直接使用model(需要参数携带),也可以创建modelandview(自己手动创建) //1、model model.addAttribute("errorMsg",ex.getErrorMsg()); return "error"; }@ControllerAdvice+@ExceptionHandler