文章目录
- 1.什么是SpringBoot?
- 2.为什么需要Spring Boot?
- 3.SpringBoot的特征?
- 4.SpringBoot的两个策略是什么?
- 5.说一下SpringBoot的自动装配流程?
- 6.说下什么是 Bean?
- 7.什么是 CSRF 攻击?如何避免?
- 8. Spring Boot 的配置文件有哪几种格式?它们有什么区别?
- 9.Spring Boot 可以兼容老 Spring 项目吗?
- 10.你如何理解 Spring Boot 配置加载顺序?
- 11.Spring Boot支持哪些嵌入式Web容器?
1.什么是SpringBoot?
Spring Boot是一个用于简化Spring应用程序开发的开源框架。它基于Spring框架,提供了一种更快速、便捷、自动化的方式来构建和部署Spring应用程序。Spring Boot的目标是降低Spring应用程序开发的复杂性,提高生产力,并默认提供一组常见的配置,以减少样板代码。
2.为什么需要Spring Boot?
- 简化配置: 默认配置和自动配置,减少了繁琐的XML配置文件和代码设置的需求,使开发更加简单和高效。
- 快速开发: 开箱即用的模板和组件,可以快速启动新项目,同时还提供了内置的Web服务器,无需手动配置即可运行应用程序。
- 集成性: 集成了众多常用的库和框架,使得与各种数据存储、消息队列、安全性和云服务的集成变得更加容易。
- 微服务支持: Spring Boot为构建微服务架构提供了良好的支持,使开发者可以轻松创建、部署和管理分布式应用程序。
- 自动化任务: Spring Boot支持定时任务、批处理处理等自动化任务,使开发者能够更轻松地处理后台处理和调度。
- 生态系统: 拥有庞大的生态系统和活跃的社区支持,可以获取大量的扩展模块和文档资源。
- 开放性: 开发者选择他们最喜欢的开发工具,并支持多种构建工具,如Maven和Gradle。
3.SpringBoot的特征?
- 自动配置(Auto-Configuration): Spring Boot通过自动配置尝试根据项目的依赖和类路径上的资源来配置Spring应用程序。这意味着开发者无需手动配置大量的Spring配置文件,Spring Boot会根据环境和依赖自动配置应用程序。
- 起步依赖(Starter Dependencies): Spring Boot提供了一组预定义的"起步依赖",这些依赖包含了特定类型的功能和库,可以根据需要添加到项目中。起步依赖简化了依赖管理,使构建Spring应用程序更加方便。
- 内嵌Tomcat或Jetty等Servlet容器;
- 生产就绪(Production-Ready): Spring Boot提供了一组功能,如健康检查、指标监控、远程配置等,帮助将应用程序变成生产就绪的状态。Spring Boot Actuator模块提供了这些功能。
- 外部化配置: Spring Boot支持将应用程序的配置从代码中分离出来,可以通过属性文件、YAML文件、环境变量等方式进行配置。这使得应用程序更易于配置和管理。
- 无需代码生成和XML配置: Spring Boot采用基于Java的配置方式,减少了XML配置文件的使用。同时,它通过约定和默认配置来简化开发,无需生成大量样板代码。
- 生态系统: Spring Boot拥有强大的生态系统,包括大量的插件和扩展,用于集成各种数据库、消息队列、安全性等功能。
4.SpringBoot的两个策略是什么?
(1)开箱即用
Outofbox,是指在开发过程中,通过在MAVEN项⽬的pom⽂件中添加相关依赖包,然后使⽤对应注解来代替繁琐的XML配置⽂件以管理对象的⽣命周期。这个特点使得开发⼈员摆脱了复杂的配置⼯作以及依赖的管理⼯作,更加专注于业务逻辑。
(2)约定优于配置
Convention over confifiguration,是⼀种由SpringBoot本身来配置⽬标结构,由开发者在结构中添加信息的软件设计范式。这⼀特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发⼈员需要做出决定的数量,同时减少了⼤量的XML配置,并且可以将代码编译、测试和打包等⼯作⾃动化。
5.说一下SpringBoot的自动装配流程?
- 说到Springboot自动装配流程那就离不开,Springboot的核心注解 @SpringbootApplication,这是个复合注解。有以下的注解组成:
@EnbaleAutoConfiguration自动装配注解,Springboot能够轻松的继承其它第三方框架就是靠这个注解。比如你自己写了一个JDBC的框架想要集成进来,就需要这个注解。
@ComponentScan注解,主要的工作是扫描被@Service、@Controller等注解备注的类或者是方法。扫描之后会通知Springboot框架生成一个对象。依赖注入的bean就是靠这个注解扫描的。 - 上面提到了@EnbaleAutoConfiguration注解,这也是个复合注解。有以下注解组成:
@Import注解导入的是一个Java类EnbaleAutoConfigurationImportSelector.class。导入配置。
EnbaleAutoConfigurationImportSelector,这是个自动配置导入选择器,它的作用就按照约定来配置选择器,这个规定就是在META-INF 下的Spring.factories中,根据自己的需求去选择。这就是Springboot的一个特点–约定大于配置。 - EnbaleAutoConfigurationImportSelector继承了AutoConfigurationImportSelector类,类里面有个方法:
selectImports方法,这个方法里面调用了
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
- getCandidateConfigurations方法中调用了loadFactoryNames方法这个方法里面就详细说明了从哪获取到的需要加载的配置项。源码如下:
public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
Enumeration<URL> urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories");
ArrayList result = new ArrayList();
while(urls.hasMoreElements()) {
URL url = (URL)urls.nextElement();
Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));
String factoryClassNames = properties.getProperty(factoryClassName);
result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));
}
return result;
} catch (IOException var8) {
throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() + "] factories from location [" + "META-INF/spring.factories" + "]", var8);
}
}
SpringBoot1.5版本以后自动装配图解:
SpringBoot1.5之前:
6.说下什么是 Bean?
Bean 只是普通的 Java 对象。在 Spring Boot 上下文中,它们被视为 Java 对象 + 在应用程序启动时自动初始化并由 Spring IOC 容器管理的对象。我们有“@Bean”注解来实现这一点。
7.什么是 CSRF 攻击?如何避免?
在CSRF攻击中,攻击者试图利用用户的身份进行非授权的操作,通过欺骗用户在登录状态下执行恶意操作,而无需其明确的授权。
- 使用CSRF令牌:为每个用户会话生成一个随机的CSRF令牌,并将其嵌入到表单中或包含在请求头中。服务器在接收请求时验证CSRF令牌是否与用户会话匹配,如果不匹配则拒绝请求。
- 检查Referer头:服务器可以检查请求的Referer头部,确保请求来源于合法的网站。但这不是完全可靠的方法,因为有些浏览器可能不会发送Referer头,或者攻击者可以伪造Referer头。
- 同源策略(Same-Origin Policy):Web浏览器实施了同源策略,限制了跨域请求。因此,确保敏感操作只能从特定域或子域进行访问,以减少跨站点请求伪造的风险。
8. Spring Boot 的配置文件有哪几种格式?它们有什么区别?
主要有.properties
和.yml
格式,它们的区别主要是书写格式不同。另外,.yml
格式不支持 @PropertySource
注解导入配置。
9.Spring Boot 可以兼容老 Spring 项目吗?
可以兼容,使用 @ImportResource 注解导入老 Spring 项目配置文件。
10.你如何理解 Spring Boot 配置加载顺序?
Spring Boot配置加载顺序优先级是:propertiese文件、YAML文件、系统环境变量、命令行参数。
11.Spring Boot支持哪些嵌入式Web容器?
Tomcat、Jetty、Undertow。