目录
- Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
- 如何理解 Spring Boot 中的 Starters?
- Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
- Spring Boot、Spring MVC 和 Spring 有什么区别?
- SpringBoot自动配置原理是什么?
- 什么是JavaConfig?
- SpringBoot启动时都做了什么?
- bootstrap.properties和application.properties 有何区别?
- SpringBoot中如何解决跨域问题?
- SpringBoot多数据源拆分的思路?
- SpringBoot 多数据源事务如何管理?
- 什么是Spring Profiles?
- spring-boot-starter-parent 有什么用 ?
- SpringBoot 实现热部署有哪几种方式 ?
- 如何实现 Spring Boot 应用程序的安全性?
- Spring Boot中的监视器是什么?
- 前后端分离,如何维护接口文档?
- 如何使用 Spring Boot 实现异常处理?
- Spring Boot 中如何实现定时任务?
- 微服务中如何实现 session 共享?
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下3 个注解:
- @SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
- @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
- @ComponentScan:Spring组件扫描。
如何理解 Spring Boot 中的 Starters?
- Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。
- 如你想使用Spring JPA访问数据库,只要加入springboot-starter-data-jpa启动器依赖就能使用了。Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖
Spring Boot 的核心配置文件有哪几个?它们的区别是什么?
- Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。
- application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。
bootstrap 配置文件有以下几个应用场景。
- 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性;
- 一些加密/解密的场景;
Spring Boot、Spring MVC 和 Spring 有什么区别?
Spring
- Spring最重要的特征是依赖注入。所有 SpringModules 不是依赖注入就是 IOC 控制反转。当我们恰当的使用 DI 或者是 IOC 的时候,我们可以开发松耦合应用。松耦合应用的单元测试可以很容易的进行。
Spring MVC
- Spring MVC 提供了一种分离式的方法来开发 Web 应用。通过运用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。
SpringBoot
- Spring 和 SpringMVC 的问题在于需要配置大量的参数。Spring Boot 通过一个自动配置和启动的项来目解决这个问题。为了更快的构建产品就绪应用程序,Spring Boot 提供了一些非功能性特征。
SpringBoot自动配置原理是什么?
- SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration。
- 查看@EnableAutoConfiguration,其作用是利用AutoConfigurationImportSelector给容器中导入一些组件。
- 查看AutoConfigurationImportSelector,其中public String[] selectImports(AnnotationMetadata annotationMetadata)方法内 最终调用getCandidateConfigurations()方法
- 查看 getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes),获取候选的配置,这个是扫描所有jar包类路径下"META-INF/spring.factories"
- 然后把扫描到的这些文件包装成Properties对象。
- 从properties中获取到EnableAutoConfiguration.class类名对应的值,然后把他们添加在容器中。
简而言之,整个过程就是将类路径下"META-INF/spring.factories"里面配置的所有EnableAutoConfiguration的值加入到容器中。
什么是JavaConfig?
Spring JavaConfig是Spring社区的产品,它提供了一种纯Java方法来配置Spring IoC容器。因此,它有助于避免使用XML配置。使用JavaConfig 的优点是:
- 面向对象的配置。由于配置在JavaConfig中定义为类,因此用户可以充分利用Java中面向对象的功能。一个配置类可以子类化另一个,覆盖其@Bean方法等。
- 减少或消除XML配置。已经证明了基于依赖注入原理的外部化配置的好处。但是,许多开发人员不希望在XML和Java之间来回切换。JavaConfig为开发人员提供了一种纯Java方法来配置Spring容器,该容器在概念上类似于XML配置。在技术上可以仅使用JavaConfig配置类来配置容器,但是在实践中,许多人发现将JavaConfig与XML混合匹配是理想的。
- 类型安全和重构友好。JavaConfig提供了一种类型安全的方法来配置Spring容器。由于Java 5.0支持泛型,现在可以按类型而不是按名称检索bean,而不需要任何强制转换或基于字符串的查找
SpringBoot启动时都做了什么?
- SpringBoot启动的时候,会构造一个SpringApplication的实例,然后调用这个实例的run方法,在run方法调用之前,也就是构造SpringApplication的时候会进行初始化的工作,初始化的时候会做以下几件事:
- a.把参数sources设置到SpringApplication属性中,这个sources可以是任何类型的参数.
- b.判断是否是web程序,并设置到webEnvironment的boolean属性中.
- c.创建并初始化ApplicationInitializer,设置到initializers属性中 。
- d.创建并初始化ApplicationListener,设置到listeners属性中 。
- e.初始化主类mainApplicatioClass
- SpringApplication构造完成之后调用run方法,启动SpringApplication,run方法执行的时候会做以下几件事:
- a.构造一个StopWatch计时器,用来记录SpringBoot的启动时间 。
- b.获取SpringApplicationRunListeners并封装到SpringApplicationRunListeners中启动,用于监听run方法的执行。
- c.创建并初始化ApplicationArguments,获取run方法传递的args参数。
- d.创建并初始化ConfigurableEnvironment(环境配置)。
- e.打印banner和版本。
- f.构造Spring容器(ApplicationContext)上下文。
- g.SpringApplicationRunListeners发布finish事件。
- h.StopWatch计时器停止计时,日志打印总共启动的时间。
- j.发布SpringBoot程序已启动事件(started())
- k.调用ApplicationRunner和CommandLineRunner
- l.最后发布就绪事件ApplicationReadyEvent,标志着SpringBoot可以处理就收的请求了(running())
bootstrap.properties和application.properties 有何区别?
-
bootstrap(.yml或者.properties):
- bootstrap由父ApplicationContext加载的, 比application优先加载,配置在应用程序上下文的引导阶段生效。
- bootstrap里面的属性不能被覆盖
- 一般来说我们在Spring Cloud Config或者Nacos中会用到它。
-
application(.yml或者.properties):
- 由ApplicationContext加载,
- 用于Springboot项目的自动化配置
SpringBoot中如何解决跨域问题?
- 方法或者类上标注@CrossOrigin注解
- 定义全局CORS配置,自定义放行哪些原始域、放行哪些请求方式、放行哪些原始请求头部信息、暴露哪些头部信息等等
- 拦截器的方式CorsFilter
SpringBoot多数据源拆分的思路?
先在properties配置文件中配置两个数据源,创建分包mapper,使用@ConfifigurationProperties读取properties中的配置,使用@MapperScan注册到对应的mapper包中
SpringBoot 多数据源事务如何管理?
- 第一种方式是在 service 层的@TransactionManager 中使用transactionManager 指定 DataSourceConfig 中配置的事务
- 第二种是使用 jta-atomikos 实现分布式事务管理保护
什么是Spring Profiles?
- Spring Profiles 允许用户根据配置文件(dev,test,prod 等)来注册bean。
- 因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在 PRODUCTION中,某些其他 bean可以加载。
- 假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。Spring Boot使得使用配置文件非常简单。
spring-boot-starter-parent 有什么用 ?
- 提供了springboot统一的依赖管理和插件管理;主要的依赖其实是继承了spring-boot-dependencies(通过标签dependencyManagement管理依赖声明),本质是继承了它然后扩展了插件配置;
spring-boot-starter-parent具体作用:
- 引入父pom里面的依赖时无须指定版本;
- java版本,项目编码格式,资源引用描述符已经设置好
- 插件管理
- 封装了配置文件的过滤规则
- 封装了打可执行jar、war的配置
- 封装了插件的版本信息
- 封装了日期格式
- 引入了eclipse和IDEA相关依赖简化了配置,达到开箱即用等
SpringBoot 实现热部署有哪几种方式 ?
- Spring Loaded
- Spring-boot-devtools
如何实现 Spring Boot 应用程序的安全性?
- 为了实现 Spring Boot 的安全性,我们使用 spring-boot-starter-security 依赖项,并且必须添加安全配置。
- 它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法
Spring Boot中的监视器是什么?
- Spring boot actuator是spring启动框架中的重要功能之一。
- Spring boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。
- 有几个指标必须在生产环境中进行检查和监控。
- 即使一些外部应用程序可能正在使用这些服务来向相关人员触发警报消息。
- 监视器模块公开了一组可直接作为HTTP URL访问的REST端点来检查状态
前后端分离,如何维护接口文档?
- 前后端分离开发日益流行,大部分情况下,我们都是通过 Spring Boot 做前后端分离开发,前后端分离一定会有接口文档,不然会前后端会深深陷入到扯皮中。
- 一个比较笨的方法就是使用 word 或者 md 来维护接口文档,但是效率太低,接口一变,所有人手上的文档都得变。
- 在 Spring Boot 中,这个问题常见的解决方案是 Swagger ,使用 Swagger 我们可以快速生成一个接口文档网站,接口一旦发生变化,文档就会自动更新,所有开发工程师访问这一个在线网站就可以获取到最新的接口文档,非常方便。
如何使用 Spring Boot 实现异常处理?
- Spring 提供了一种使用 ControllerAdvice 处理异常的非常有用的方法。我们通过实现一个 ControlerAdvice 类,来处理控制器类抛出的所有异常
Spring Boot 中如何实现定时任务?
在 Spring Boot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的 @Scheduled 注解,另一个则是使用第三方框架 Quartz。
- 使用 Spring 中的 @Scheduled 的方式主要通过 @Scheduled 注解来实现。
- 使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可
微服务中如何实现 session 共享?
- 在微服务中,一个完整的项目被拆分成多个不相同的独立的服务,各个服务独立部署在不同的服务器上,各自的 session 被从物理空间上隔离开了,但是经常,我们需要在不同微服务之间共享 session
- 常见的方案就是 Spring Session + Redis 来实现 session 共享。
- 将所有微服务的 session 统一保存在 Redis 上,当各个微服务对 session 有相关的读写操作时,都去操作 Redis 上的 session 。
- 这样就实现了 session 共享,Spring Session 基于 Spring 中的代理过滤器实现,使得 session 的同步操作对开发人员而言是透明的,非常简便