5.SpringBoot
1.Spring、SpringMVC、 Springboot区别:
Spring MVC是Spring中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。
Spring Boot只是简化了配置,如果需要构建MVC架构的Web程序,还是要使用Spring MVC作为MVC框架,只是说Spring Boot简化了Spring MVC的很多配置。
Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转。当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用。
Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,ModelAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
Spring和Spring MVC的问题在于需要配置大量的参数。SpringBoot通过一个自动配置和启动的项来解决这个问题。
2.什么是SpringBoot?
Spring Boot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。
用来简化Spring应用的初始搭建以及开发过程,使用特定的方式来进行配置。
·创建独立的Spring引用程序main方法运行
·嵌入的tomcat无需部署war文件
·简化maven配置
·自动配置Spring添加对应的功能starter自动化配置
·SpringBoot来简化Spring应用开发,约定大于配置,去繁化简(约定优于配置是一种软件设计的范式,其核心思想:使用一些约定俗成的语言是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。)
3.为什么使用SpringBoot?
独立运行
Spring Boot内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
简化配置
spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。SpringBoot的依赖整合了常用的开发库,例如spring-webmvc、jackson-json、validation-api和tomcat等。当我们引入核心依赖时,SpringBoot会自引入其他依赖。我们不需要再自己寻找web相关的jar包依赖一个一个自己添加进去,只需要引入SpringBoot为我们提供的核心依赖即可。
自动配置
Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 springboot-starter-web 启动器就能拥有 web 的功能,无需其他配置。SpringBoot将原有的XML配置改为Java配置,将bean注入改为使用注解注入的方式(@Autowire),并将多个xml、properties配置浓缩在一个appliaction.yml配置文件中。
无代码生成和XML配置
Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring4.x 的核心功能之一。
应用监控
Spring Boot 提供一系列端点可以监控服务及应用,做健康检测。
4.SpringBoot自动配置的原理?
在Spring程序main方法中,添加@SpringBootApplication或者@EnableAutoConfiguration会自动去maven中读取每个starter中的spring.factories文件,该文件里配置了所有需要被创建的Spring容器中的bean。
5.Spring Boot的核心注解是哪些?由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,也是SpringBoot的核心注解,主要组合包含了以下3个注解:
@SpringBootConfiguration:组合了@Configuration注解,实现配置文件的功能;
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置的功能:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class});
@ComponentScan:Spring组件扫描。
6.SpringBoot的核心配置文件有哪几个?区别是什么?
SpringBoot的核心配置文件是application和bootstrap配置文件。
application配置文件主要用于Spring Boot项目的自动化配置。
bootstrap配置文件有以下几个应用场景:
·使用Spring Cloud Config配置中心时,这时需要在bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
·一些固定的不能被覆盖的属性;
·一些加密/解密的场景;
7.什么是Spring Boot Starter(启动器)?有哪些常用的?
和自动配置一样,Spring Boot Starter的目的也是简化配置,而Spring Boot Starter解决的是依赖管理配置复杂的问题,有了它,当需要构建一个Web应用程序时,不必再遍历所有的依赖包,一个一个地添加到项目的依赖管理中,而是只需要一个配置spring-boot-starter-web, 同理,如果想引入持久化功能,可以配置spring-boot-starter-data-jpa:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> |
Spring Boot 也提供了其它的启动器项目包括,包括用于开发特定类型应用程序的典型依赖项。
spring-boot-starter-web-services - SOAP Web Services
spring-boot-starter-web - Web和RESTful应用程序
spring-boot-starter-test - 单元测试和集成测试
spring-boot-starter-jdbc - 传统的JDBC
spring-boot-starter-hateoas - 为服务添加HATEOAS功能
spring-boot-starter-security - 使用SpringSecurity进行身份验证和授权
spring-boot-starter-data-jpa - 带有 Hibernate的Spring Data JPA
spring-boot-starter-data-rest - 使用Spring Data REST公布简单的REST服务
8.如何自定义Spring Boot Starter?
·实现功能
·添加Properties
@Data @ConfigurationProperties(prefix = "com.pdai") public class DemoProperties { private String version; private String name; } |
·在 IntelliJ IDEA 中创建一个新的 Maven 项目,作为自定义 Starter 的基础。使用 `spring-boot-starter-parent` 作为父项目
·添加AutoConfiguration //自动配置类
@Configuration @EnableConfigurationProperties(DemoProperties.class) public class DemoAutoConfiguration { @Bean public com.pdai.demo.module.DemoModule demoModule(DemoProperties properties){ com.pdai.demo.module.DemoModule demoModule =new com.pdai.demo.module.DemoModule(); demoModule.setName(properties.getName()); demoModule.setVersion(properties.getVersion()); return demoModule; } } |
·编写 Starter 元数据:在项目根目录中的META-INF目录下创建spring.factory文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.pdai.demospringbootstarter.DemoAutoConfiguration |
·打包和安装:mvn install(将自定义 Starter 打包并安装到本地 Maven 仓库中)
·测试自定义starter:在其他项目的pom.xml里添加依赖关系
9.spring-boot-starter-parent有什么作用?
新建一个SpringBoot项目,默认有parent,这个parent就是spring-boot-starter-parent,spring-boot-starter-parent主要有如下作用:
·定义了Java编译版本
·使用UTF-8格式编码
·继承自spring-boor-dependencies,这里面定义了依赖的版本,也正是因为继承了这个依赖,所以我们在写依赖时才不需要写版本号
·执行打包操作的配置
·自动化的资源过滤
·自动化的插件配置
10.为什么需要spring-boot-maven-plugin?
spring-boot-maven-plugin提供了一些像jar一样打包或者运行应用程序的命令。
(1)spring-boot:run 运行SpringBoot应用程序;
(2)spring-boot:repackage 重新打包你的jar包或者是war包使其可执行
(3)spring-boot:start和spring-boot:stop管理Spring Boot应用程序的生命周期
(4)spring-boot:build-info生成执行器可以使用的构造信息
11.SpringBoot 打成jar和普通的jar有什么区别?
Spring Boot项目打包成的jar是可执行jar ,这种jar可以直接通过java -jar xxx.jar命令来运行,这种jar不可以作为普通的jar被其他项目依赖,即使依赖了也无法使用其中的类。
Spring Boot的jar无法被其他项目依赖,主要还是他和普通 jar 的结构不同。普通的 jar 包,解压后直接就是包名,包里就是我们的代码,而Spring Boot 打包成的可执行 jar 解压后,在 \BOOT-INF\classes目录下才是我们的代码,因此无法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,将Spring Boot项目打包成两个jar ,一个可执行,一个可引用。
12.如何使用Spring Boot实现异常处理?
Spring3.2提供了一种使用ControllerAdvice处理异常的方法。通过实现一个ControllerAdvice类,来处理控制类抛出的所有异常。配合@ExceptionHandler
注解,进行全局异常处理。
@ControllerAdvice public class TestControllerAdvised { @ExceptionHandler(value = Exception.class) public String modelAndViewException(){ // 做一些异常的处理逻辑 } }
13.SpringBoot 实现热部署有哪几种方式?
Spring Loaded
Spring-boot-devtools
14.Spring Boot中的监视器是什么?
Spring boot actuator是spring启动框架中的重要功能之一。Spring boot监视器可帮助访问生产环境中正在运行的应用程序的当前状态。
有几个指标必须在生产环境中进行检查和监控。即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态。
15.Spring Boot 可以兼容老 Spring 项目吗?
可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。
16.SpingBoot自动装配原理详解
什么是 SpringBoot 自动装配?
自动装配,简单来说就是自动把第三方组件的Bean 装载到 Spring IOC 器里面,不需要开发人员再去写 Bean 的装配配置。使用SpringBoot时,只需引人对应的Starter,SpringBoot启动时便会自动加载相关依赖,集成相关功能。
SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到JVM类加载机制与Spring的容器知识),并执行类中定义的各种操作。对于外部jar来说,只需要按照SpringBoot定义的标准,就能将自己的功能装置进SpringBoot。
SpringBoot 是如何实现自动装配的?如何实现按需加载?
在Spring Boot应用里面,只需要在启动类加上@SpringBootApplication注解就可以实现自动装配。@SpringBootApplication是一个复合注解,大概可以把 @SpringBootApplication看作是@Configuration、@EnableAutoConfiguration、@ComponentScan 注解的集合。
·@EnableAutoConfiguration:启用SpringBoot 的自动配置机制
·@Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
·@ComponentScan: 扫描被@Component (@Service,@Controller)注解的bean,注解默认会扫描启动类所在的包下所有的类,可以自定义不扫描某些bean。
Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖。
-
@EnableAutoConfiguration注解导入AutoConfigurationImportSelector类。
-
selectImports方法调用SpringFactoriesLoader.loadFactoryNames()扫描所有jar下面的对应的META-INF/spring.factories文件.
-
把所有在spring.factories文件中扫描到的全类名进行实例化加载到IOC容器中。
自动装配的实现主要是依靠三个核心的点:
(1)starter:引入的start的类中,必须要有一个用@Configuration注解修饰的配置类,类中用@Bean去指定那写对象需要装配到IOC容器中
(2)这个配置类在第三方jar包中,通过Spring中约定大于配置的理念,把配置类的全路径放在 classpath:*META-INF/spring-factories中。这样SpringBoot 就可以第三方Jar中配置类的位置,这一步主要是用到SpringFactoryLoader来完成的(SPI机制)
(3)通过importSelector接口实现对这些配置类的动态加载,完成自动装配的动作。
起始SpringBoot自动装配就是约定大于配置这一理念的产物,很多地方都有类似的实现,能够让开发人员将更多的注意放在业务上面。
17.Springboot的启动过程
SpringBoot启动流程主要分为两大步骤:
第一步:构造一个SpringApplication的实例,完成初始化的工作。
(1)创建并初始化ApplicationInitializer,设置到initializers属性中 。
(2)创建并初始化ApplicationListener,设置到listeners属性中 。
第二步:SpringApplication构造完成之后调用run方法,启动SpringApplication。
(1)创建并初始化计时器StopWatch,用来记录SpringBoot的启动时间。
(2)创建并初始化监听器SpringApplicationRunListeners,启动监听,监听run方法的执行。
(3)创建并初始化ApplicationArguments,获取run方法传递的args参数。
(4)创建并初始化环境配置ConfigurableEnvironment。封装main方法的参数,写入到 Environment中,发布 ApplicationEnvironmentPreparedEvent(环境事件)。
(5)创建应用程序上下文ApplicationContext。ApplicationContext是Spring中的核心接口和容器,允许容器通过应用程序上下文环境创建、获取、管理bean。
启动流程主要分为三个部分:
第一部分进行SpringApplication的初始化模块,配置一些基本的环境变量、资源、构造器、监听器;
第二部分实现了应用具体的启动方案,包括启动流程的监听模块、加载配置环境模块、及核心的创建上下文环境模块;
第三部分是自动化配置模块。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿
· Blazor Hybrid适配到HarmonyOS系统
· 支付宝 IoT 设备入门宝典(下)设备经营篇
· 万字调研——AI生成内容检测
· 解决跨域问题的这6种方案,真香!