第五章--SpringBoot重点面试题

SpringBoot 目前最常用的Java技术框架之一, 但是涉及面试题并不一定能想起多少,整理几道个人觉得重要的面试题,用作复习!

1. SpringBoot的约定优于配置

  1. 首先, 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。
  2. Spring Boot 就是约定优于配置这一理念下的产物,它类似于 Spring 框架下的一个脚手架,通过 Spring Boot,我们可以快速开发基于 Spring 生态下的应用程序。
  3. 基于传统的 Spring 框架开发 web 应用,我们需要做很多和业务开发无关并且只需要做一次的配置,比如
    a. 管理 jar 包依赖
    b. web.xml 维护
    c. Dispatch-Servlet.xml 配置项维护
    d. 应用部署到 Web 容器
    e. 第三方组件集成到 Spring IOC 容器中的配置项维护
    而在 Spring Boot 中,我们不需要再去做这些繁琐的配置,Spring Boot 已经自动帮我们完成了,这就是约定由于配置思想的体现。
  4. Spring Boot 约定由于配置的体现有很多,比如
    a. Spring Boot Starter 启动依赖,它能帮我们管理所有 jar 包版本
    b. 如果当前应用依赖了 spring mvc 相关的 jar,那么 Spring Boot 会自动内置Tomcat 容器来运行 web 应用,我们不需要再去单独做应用部署。
    c. Spring Boot 的自动装配机制的实现中,通过扫描约定路径下的spring.factories 文件来识别配置类,实现 Bean 的自动装配。
    d. 默认加载的配置文件 application.properties 等等。
    总的来说,约定优于配置是一个比较常见的软件设计思想,它的核心本质都是为了更高效以及更便捷的实现软件系统的开发和维护。

2. SpringBoot的自动配置原理

备注 : SpringBoot最高频面试题,也是框架最核心思想

@SpringBootApplication
public class AppApplication{
  	public static void main(String[] args){
				SpringApplication.run(AppApplication.class,args);
    }
}

//
@SpringBootConfiguration  // 该注解作用同@Configuration ,声明当前是一个配置类
@ComponentScan            // 组件扫描,默认扫描当前引导类所在包及其子包
@EnableAutoConfiguration  // 自动化配置的核心注解

// 
// 上面 @EnableAutoConfiguration  是自动化配置的核心注解,该注解通过@import注解导入对应的
配置选择器
内部就是读了该项目以及该项目引用的Jar包的 classpath路径下 META-INF/spring.factories文件所配
置的类的全类名.这些配置类所定义的Bean根据条件注解指定的条件决定是否需要将其导入到Spring容器;

// 条件判断 @ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个
配置类的所有 Bean 放入 Spring 容器中使用

image.png

自动装配,简单来说就是自动把第三方组件的 Bean 装载到 Spring IOC 器里面,不需要开发人员再去写 Bean 的装配配置。
在 Spring Boot 应用里面,只需要在启动类加上@SpringBootApplication 注解就可以实现自动装配。
@SpringBootApplication 是一个复合注解,真正实现自动装配的注解是@EnableAutoConfiguration。
自动装配的实现主要依靠三个核心关键技术。

  1. 引入 Starter 启动依赖组件的时候,这个组件里面必须要包含@Configuration 配置类,在这个配置类里面通过@Bean 注解声明需要装配到 IOC 容器的 Bean 对象。
  2. 这个配置类是放在第三方的 jar 包里面,然后通过 SpringBoot 中的约定优于配置思想,把这个配置类的全路径放在 classpath:/META-INF/spring.factories 文件中。这样 SpringBoot 就可以知道第三方 jar 包里面的配置类的位置,这个步骤主要是用到了 Spring 里面的 SpringFactoriesLoader 来完成的。
  3. SpringBoot 拿到所第三方 jar 包里面声明的配置类以后,再通过 Spring 提供的ImportSelector 接口,实现对这些配置类的动态加载。
    在我看来,SpringBoot 是约定优于配置这一理念下的产物,所以在很多的地方,都会看到这类的思想。它的出现,让开发人员更加聚焦在了业务代码的编写上,而不需要去关心和业务无关的配置。
    其实,自动装配的思想,在 SpringFramework3.x 版本里面的@Enable 注解,就有了实现的雏形。@Enable 注解是模块驱动的意思,我们只需要增加某个@Enable 注解,就自动打开某个功能,而不需要针对这个功能去做 Bean 的配置,@Enable 底层也是帮我们去自动完成这个模块相关 Bean 的注入。

:::info
SpringBoot 自动装配主要是基于注解编程 和 约定优于配置的思想来设计的。
自动装配就是由 Spring 自动把其他组件中的 Bean 装载到 IoC 容器中,不需要开发人员再去配置文件中添加大量的配置。我们只需要在 Spring Boot 的启动类上添加@SpringBootApplication 注解,开启自动装配。
这种自动装配的思想,在 Spring 3.x 以后就开始支持,我们只要在类上添加 @Enable注解就可以了,只是没有像 Spring Boot 这样全面地去设计。
因此,Spring 和 Spring Boot 的最大区别就是在于 Spring Boot 的自动装配

自动装配原理
@SpringBootApplication 这个注解是暴露给用户使用的入口,它的底层是由@EnableAutoConfiguration 这个注解来实现的。这样一个自动装配实现,可分为以下三个核心步骤:
第一步:启动依赖组件的时候,组件中必须要包含 @Configuration 的配置类,在这个配置类里面声明为 @Bean 注解,就将方法的返回值或者属性值 注入到 IoC 容器中。
第二步:如果是使用第三方 jar 包,Spring Boot 采用 SPI 机制,只需要在/META-INF/目录下增加 spring.factories 配置文件。然后,Spring Boot 会根据约定规则,自动使用 SpringFactoriesLoader 来加载配置文件中的内容。
第三步:Spring 获取到第三方 jar 中的配置以后,会使用调用 ImportSelector 接口来完成动态加载。
这样的设计的好处在于,大幅减少了臃肿的配置文件,而且各模块之间的依赖实现了深度解耦。比如,我们使用 Spring 创建 Web 程序时需要导入非常多的 Maven 依赖,而Spring Boot 只需要一个 Maven 依赖来创建 Web 程序,并且 Spring Boot 还把我们最常用的依赖都放到了一起,我们只需要 引入 spring-boot-starter-web 这一个依赖就可以完成一个简单的 Web 应用。
以前用 Spring 的时候需要 XML 文件配置开启一些功能,现在 Spring Boot 不用 XML配置了,只需要写一个, 加了@Configuration 注解 或者实 现对应接口的配置类就可以了.

小结
Spring Boot 自动装配是 Spring 的完善和扩展,就是为我们便捷开发,方便测试和部署,提高效率而诞生的框架技术。
:::

2.1 SpringBoot是什么?

答:SpringBoot是一个基于Spring框架的快速开发框架,它提供了构建独立的、生产级别的Spring应用所需
的各种功能和约定,省去了繁琐的配置。SpringBoot主要优点有:

简化了Spring应用的开发,集成了常用的组件和工具;
提供了自包含的HTTP服务器,可以独立运行;
约定大于配置,开发者无需过多关注配置细节,提高了开发效率;
提供了多种开发测试工具和插件,可以使开发过程更顺畅;
可以通过自动配置的方式,快速的构建一个现代化的微服务应用。

2.2 SpringBoot启动器

答:SpringBoot启动器是一个依赖项管理的基础设施,可以让你无需了解所依赖项的具体细节,就能够创建
一个可运行的应用程序。启动器的作用是自动获取和装配运行SpringBoot应用所需的依赖项和配置,比如说,
使用spring-boot-starter-web可以轻松构建一个基于Web的SpringBoot应用程序。因此,启动器
是SpringBoot自动配置功能的基础。

2.3 SpringBoot中使用AOP

在SpringBoot中,使用AOP的方式与Spring框架是相同的。
常见的方法是使用@Aspect注解定义切面,
使用@Before、@After、@AfterReturning、@AfterThrowing等注解定义通知。

2.4 SpringBoot中使用自定义异常处理

答:需要使用@ControllerAdvice注解来定义一个通用的异常处理类。
在该类中使用@ExceptionHandler注解定义针对不同异常的处理。可以选择返回一个自定义的错误视图
或者JSON数据。

2.5 SpringBoot提供哪些方式来管理应用程序配置

答:SpringBoot提供了多种方式来管理应用程序配置,包括:

application.properties 或 application.yml 文件;
环境变量;
Java系统属性;
@ConfigurationProperties注解;
命令行参数。

2.6 SpringBoot中集成MyBatis

答:可以使用spring-boot-starter-mybatis来集成MyBatis。常用注解有:

@Mapper:标记一个MyBatis的Mapper;
@Select: 标记一个查询方法;
@Insert: 标记一个插入方法;
@Update: 标记一个更新方法;
@Delete: 标记一个删除方法。

2.7 SpringBoot中如何处理文件上传

答:处理文件上传可以使用spring-boot-starter-web集成的MultipartResolver。可以直接使
用@RequestParam注解来获取上传的文件,
然后利用SpringBoot的自动配置将上传的文件保存到本地或云存储。

2.8 SpringBoot实现缓存

答:SpringBoot提供了对缓存的支持,可以通过使用spring-boot-starter-cache集成常用的缓存框架,
比如Ehcache、Redis等。通过@Cacheable、@CachePut、@CacheEvict等注解来实现缓存的访问。

2.9 SpringBoot中如何处理跨域请求

答:默认情况下,SpringBoot禁止跨域请求。
如果需要启用跨域请求,可以使用@WebFilter注解可以实现跨域请求的支持。

2.10 SpringBoot实现任务调度

答:SpringBoot集成了一些常用的任务调度框架,比如Quartz和Spring自带的任务调度框架。
可以通过使用@EnableScheduling注解开启任务调度功能,并在需要调度的方法上标记@Scheduled注解。

2.11 什么是SpringBoot自动配置?它有哪些优点

在传统的Spring应用中,我们需要手动配置很多组件和依赖项,这往往会导致配置文件过于复杂,并且很
容易出现配置错误。为了解决这些问题,SpringBoot引入了自动配置机制,让应用程序无需进行复杂的配
置就能够便捷地构建和运行。

自动配置机制是通过
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值