什么是Spring Boot?
传统SSH/SSM框架配置繁琐,有很多重复的模板配置,效率不高。
Spring Boot快速创建可独立运行,生产级别的Spring应用程序。
主要是基于Spring家族和常用第三方框架/库提供一些列自动化配置的启动器(Starter),进而能够快速搭建开发项目。
Spring Boot有哪些特点?优点缺点?
特点: 快速构建Spring项目,自动配置,降低学习门槛。
优点: 快速开发,简化配置,独立运行部署,应用监控,适合构建微服务。
缺点:集成度太高,不容易了解底层,难定位问题。
Spring Boot核心配置文件有哪几个?区别?应用场景?
核心配置文件:application.yml和bootstrap.yml。
区别:bootstrap是应用程序父上下文,加载优先于application。bootstrap里的属性不能被覆盖。
应用场景:
application:主要用于Spring Boot项目的自动化配置。
bootstrap:
- 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
- 一些固定的不能被覆盖的属性;
- 一些加密/解密的场景;
Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
启动类注解 @SpringBootApplication。包括3个注解:
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能。
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,
如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。
开启 Spring Boot 特性有哪几种方式?
1. 继承spring-boot-starter-parent项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.X.X.RELEASE</version>
</parent>
2. 导入spring-boot-dependencies项目依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.X.X.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencyManagement>
运行 Spring Boot 有哪几种方式?
1. 打包用命令行或者放入容器中运行
2.用Maven/Gradle插件运行。$ mvn spring-boot:run
3.直接执行main方法运行
如何在 Spring Boot 启动的时候运行一些特定的代码?
可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法。
启动顺序,如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序,可以实现 org.springframework.core.Ordered接口或者使用org.springframework.core.annotation.Order注解。
Spring Boot 有哪几种读取配置的方式?
Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量。
例如:
读取application文件:
info.address=Beijing info.company=Abc info.degree=high
@Value注解读取方式:
@Value ("${info.address}") private String address;
读取指定文件:
资源目录下建立config/db-config.properties:
db.username=root
db.password=123
@PropertySource+@Value注解读取方式:
@Component @PropertySource(value = { "config/db-config.properties" }) public class DBConfig1 { @Value("${db.username}") private String username; @Value("${db.password}") private String password;
...
}
@PropertySource+@ConfigurationProperties注解读取方式:
标有 @ConfigurationProperties 的类的所有属性和配置文件中相关的配置项进行绑定,绑定之后我们就可以通过这个类去访问全局配置文件中的属性值,不用像@Value的方式去一个一个的取。
@Component @ConfigurationProperties(prefix = "db") @PropertySource(value = { "config/db-config.properties" }) public class DBConfig2 { private String username; private String password; ... }
Spring Boot 支持哪些日志框架?推荐和默认的日志框架是哪个?
Spring Boot 支持 Java Util Logging, Log4j2, Lockback 作为日志框架,如果你使用 Starters 启动器,Spring Boot 将使用 Logback 作为默认日志框架。
SpringBoot 实现热部署有哪几种方式?
- Spring Loaded (过时)
- Spring-boot-devtools
Spring Boot配置加载顺序?
1. properties文件
2. YAML文件
3. 系统环境变量
4.命令行参数
保护 Spring Boot 应用有哪些方法?
- 1. 在生产中使用HTTPS
- 2.使用Snyk检查你的依赖关系
- 3.升级到最新版本
- 4.启用CSRF保护
- 5.使用内容安全策略防止XSS攻击
- 6.使用OpenID Connect进行身份验证
- 7.使用密码哈希
- 8. 安全地存储密码
- 9. 使用OWASP的ZAP测试应用程序
- 10. 让安全团队进行代码审查
Spring Boot 2.X 有什么新特性?与 1.X 有什么区别?
配置变更,JDK版本升级,第三方类库升级,响应式Spring编程,HTTP/2支持,配置属性板顶。
SpringBoot自动配置原理?
在main()启动SpringBoot时,只有一个注解@SpringBootApplication。这个注解包括3个注解:
@SpringBootConfiguration:点进去以后可以发现底层是Configuration注解,就是支持JavaConfig的方式来进行配置(使用Configuration配置类等同于XML文件)。
@EnableAutoConfiguration:开启自动配置功能(后文详解)
@ComponentScan:这个注解,就是扫描注解,默认是扫描当前类下的package。将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。
Spring Boot的自动配置注解核心是@EnableAutoConfiguration。
这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。
@AutoConfigurationPackage:自动配置包
@Import:给IOC容器导入组件
1. @AutoConfigurationPackage里依靠的仍然时@Import注解:
AutoConfigurationPackages.Registrar是静态内部类,核心是:
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
在默认的情况下就是将:主配置类(@SpringBootApplication)的所在包及其子包里边的组件扫描到Spring容器中。
@AutoConfigurationPackage是扫描@Entity注解,@ComponentScan是扫描@Controller/@Service/@Component/@Repository这些注解。
两者扫描对象是不一样的。
1.2 AutoConfigurationImportSelector.class
核心实现selectImports中的getAutoConfigurationEntry()->getCandidateConfigurations()
通过SpringFactoriesLoader.loadFactoryNames来加载,进入核心代码:
FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories
Spring启动的时候会扫描所有jar路径下的META-INF/spring.factories,将其文件包装成Properties对象
从Properties对象获取到key值为EnableAutoConfiguration的数据,然后添加到容器里边。