目录
5. SpringBoot项目启动时做了些什么(启动流程)?
7. Spring Boot中的starter是什么?有什么优点?
8. SpringBoot核心配置文件是什么?bootstrap.properties和application.properties区别?
9. Spring Boot项目打的jar包和普通的jar有什么区别?
13. 比较一下SpringSecurity和Shiro的优缺点?
1. 什么是SpringBoot?有什么优点?
SpringBoot是一个基于Spring框架的快速开发框架,它采用约定大于配置,自动装配的方式,可以快速地创建独立的,生产级别的,基于Spring的应用程序。
相比于传统的Spring框架,SpringBoot更加简单易用,它将大量常见的配置和依赖项内置到框架,开发人员可以快速搭建一个完整的应用程序,无需手动配置复杂的XML文件或Java代码。SpringBoot还支持集成其他流行的框架和技术等。
2. 什么是约定大于配置?
约定大于配置是一种软件开发理念,它的核心思想是:通过建立约定,默认值和惯例,减少编程中需要做出的决策,提高开发效率和生产力。
例如在SpringBoot种,默认按照一定的命名规则查找数据库连接,bean定义等相关内容,这样开发人员就可以省略大量的配置和代码,直接使用默认的约定和规则来完成开发任务,从而提高开发效率和代码质量。
总的来说,约定大于配置是一种软件开发的优化策略,通过建立约定和默认值,帮助开发人员快速构建和维护高质量的应用程序,减少出错的可能性,提高开发效率和生产力。
3.SpringBoot Starter实现热部署的方式?
- 热部署就是可以不用重新运行SpringBoot项目可以实现操作后台代码自动更新到运行的项目中
- 方式:
- SpringLoaded
- Spring-Boot-devtools
- 模板热部署
- Jrebel
4. 什么是yaml?有什么优势?
YAML是一种轻量级的数据序列化格式,采用缩进的方式表示复杂的数据结构,易读,易写,易扩展。被广泛应用于配置文件,数据交换和其他场景。
5. SpringBoot项目启动时做了些什么(启动流程)?
- 加载SpringBoot配置文件:SpringBoot会先加载内部的spring-boot-autoconfiguration和spring-boot-starter等Starter,然后再加载用户自定义的配置文件application.properties或application.yml,并将其中的配置项加载到Spring环境中。
- 自动配置IOC容器:SpringBoot根据应用程序所引入的依赖和上下文的配置,自动配置SpringIOC容器。它会自动扫描所有带有@Component以及派生注解的bean,并添加相应的依赖关系,从而构建出整个应用程序的bean容器
- 扫描处理注解:SpringBoot根据配置文件中的@ComponentScan注解指定的扫描路径,扫描所有带有注解的类,并进行相关的处理。例如它会扫描加了@RestController,@RequestMapping,@Service等注解的类,并将其注册到SpringIOc容器,从而构建整个应用程序的bean。
- 开启Web服务器:如果应用程序是Web应用程序,SpringBoot会自动开启内嵌的Tomcat,等Web服务器,并将应用程序注册到服务器中,使其可以响应请求。
- 运行CommandLineRunner和ApplicationRunner:如果应用程序中有实现了CommandLineRunner或者ApplicationRunner接口的bean,SpringBoot会在容器启动完成后自动调他们的run()方法。
- 注册ServletContextListener:Spring Boot会自动注册SpringBootServletInitializer,ServletContextListener和Filter等,以保证程序正常运行。
6. SpringBoot启动时自动配置的原理?
-
SpringBoot 启动时会从类路径下的
META-INF/spring.factories
中获取EnableAutoConfiguration
指定的值。 -
Spring Boot 将这些值作为自动配置类导入容器,并使它们生效,帮我们进行自动配置工作。
-
整个 J2EE 的整体解决方案和自动配置都在
spring-boot-autoconfigure
的 jar 包中。 -
它会给容器中导入非常多的自动配置类(
xxxAutoConfiguration
),就是给容器中导入这个场景需要的所有组件,并配置好这些组件。 -
有了自动配置类,就免去了我们手动编写配置注入功能组件等的工作,可以大大提高开发的效率和降低出错的风险。同时,这些自动配置类还提供了很多默认值,可以充分利用 Spring Boot 的约定大于配置的特点,让我们的开发更加简单和高效。
注解@EnableAutoConfiguration,@Configuration,@ConditionalOnClass就是自动装配的核心。
@EnableAutoConfiguration给容器导入META-INF/spring-factories里定义的自动配置类。
每个自动配置类结合对应的xxxProperties.java读取配置文件进行自动配置功能。
7. Spring Boot中的starter是什么?有什么优点?
在SpringBoot种,Starter是一种Maven依赖项集合,可以方便地引入一组相关的依赖项来支持某种特定的功能。
SpringBootStarter命名规则通常是spring-boot-starter-*,其中 * 表示某种包括技术,模块或服务等
例如:spring-boot-starter-web就是一个web应用程序所需要的基本依赖项集合,包含了SpringMVC,Tomcat和其他依赖项。
SpringBootStarter优点:
- 简化应用程序的构建:Starter可以帮助开发人员快速引入所需的依赖项,从而简化构建过程
- 确保依赖项版本兼容性:Starter可以确保所有的依赖项版本兼容性,避免因版本不兼容而导致的依赖项冲突问题。
- 避免不必要的依赖项:Starter只包含必要的依赖项,避免了不必要的依赖项的引入,从而减少了应用程序的体积。
- 可扩展性强:在需要自定义配置或添加其他依赖项时,可以通过继承和覆盖Starter中的配置文件或类来扩展Starter。
8. SpringBoot核心配置文件是什么?bootstrap.properties和application.properties区别?
bootstrap.properties/.yml 是SpringBoot应用程序启动加载的第一个配置文件,通常用于制定一些底层配置,如连接配置,加密配置等。通常情况下,这个文件来配置SpringCloudConfigServer的访问信息或者是其他一些需要启动顺序更早的配置。
application.yml/.properties则是应用程序的主要配置文件,包含了大部分业务相关的配置,如数据库配置,缓存配置,日志配置,服务端口配置等。该文件会覆盖bootstrap中的同名配置。
两者的区别?
- 加载顺序不同。bootstrap.yml/.properties比application.yml/.properties更早加载,并且只加载一次。
- 作用范围不同。bootstrap.yml/.properties主要用于底层配置,如连接配置,加密解密配置;而application.yml/.properties则是应用程序的主要配置,包含了应用程序中大部分的业务相关配置。
bootstrap.yml/.properties可以使用SpringCloudConfigServer实现远程配置中心,从而实现动态的配置管理。
9. Spring Boot项目打的jar包和普通的jar有什么区别?
SpringBoot打的jar包内置了Tomcat,Jetty等Web服务器,可以直接通过命令java -jar xxx.jar启动应用程序,不需要手动部署到Web服务器中。这种方式使得应用程序的部署和运维非常方便。这种jar不可以作为普通的jar被其他项目依赖,即使依赖也无法使用其中的类。无法被其他项目依赖主要原因是他和普通jar结构不同。普通的jar包,解压后就是包名,包里面就是代码,而SpringBoot 的jar包解压后在\Boot-INF\classes目录下才是我们的代码,因此无法直接引用。如果非要引用,可以在pom.xml文件增加配置,将项目打成两个jar,一个可执行,一个可引用。
10. SpringBoot如何实现定时任务?
主要有两种不同方式,一个是使用Spring中的@Scheduled注解,另一个是使用第三方框架。
11. SpringBoot性能如何优化?
- 启动速度优化:SpringBoot应用程序启动时会自动扫描并加载所有的bean,可能导致启动过慢。可以使用延迟初始化机制,配置懒加载等方式加快启动。
- 内存优化:关闭不必要的自动配置,配置适当的线程池,减少HTTP响应体大小等。
- IO优化:考虑使用异步IO,使用缓存技术等提升IO性能。
- 数据库优化:使用数据库连接池,优化SQL语句,使用缓存等方式提高数据库访问性能。
- 日志优化:减少不必要的日志输出,采用异步日志方式提升日志性能。
- 静态资源优化:压缩静态资源,启用浏览器缓存等方式减少静态资源加载时间。
- 代码优化:必满重复执行代码,优化算法,缓存计算量等方式提高程序执行效率。
- ......
12. 如何实现SpringBoot项目的安全性?
为了实现SpringBoot的安全性,我们使用spring-boot-starter-security依赖项,并且添加安全配置。配置类必须扩展WebSecurityConfigurationAdapter并覆盖其方法。
13. 比较一下SpringSecurity和Shiro的优缺点?
由于SpringBoot官方提供大量方便地开箱即用的Starter,包括SpringSecurity的Starter,使得Spring Boot项目中使用SpringSecurity更加容易,只需要添加一个依赖就可以保护所有的接口,所以如果是Spring Boot项目一般选择SpringSecurity。它和Shiro相比主要有以下区别:
- SpringSecurity是一个重量级的安全管理框架;Shiro则是轻量级的安全管理框架。
- SpringSecurity概念复杂,配置繁琐;Shiro配置简单,概念简单。
- SpringSecurity功能强大,Shiro功能简单
14. SpringBoot是否可以使用XML配置?
SpringBoot仍然支持使用XML配置文件。不过SpringBoot更推荐基于Java注解的配置方式,因为它更加灵活且易于维护。如果要使用XML配置,通过@ImportResource注解可以引入一个XML配置。
@SpringBootApplication
@ImportResource("classpath:application-context.xml")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
15. SpringBoot事务管理的基本流程
首先使用@EnableTransactionManagement注解开启事务后,在Service层方法上加上@Transaction注解便可。
16. SpringBoot如何定义多套不同环境配置?
提供多套配置文件:
application.yml,application-dev.yml,application-test.yml,application-prod.yml
17. 什么是Swagger
Swagger是一个API文档生成工具,可以根据代码注释自动生成API文档,同时提供易于使用的UI界面,可以让开发者方便地查看和测试API接口。