转载

《面试》SpringBoot面试题

SpringBoot是现在使用是如此的广泛,几乎所有的后端面试官都会就它的使用和基本原理方面进行考察。

为什么要用Spring Boot?

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".

SpringBoot是Spring基金会下的子项目,是Spring组件一站式解决方案,通过自动配置提供了各种stater,简化了大量的配置工作。 从而使开发者能够快速的搭建生产级Spring应用。

特性:

  1. 不需要使用XML配置。
  2. 提供stater简化构建配置。
  3. 自动配置spring与第三方库集成。
  4. 嵌入式web服务让部署更加便捷。
  5. 提供生产级的特性,如监控、健康检查、外部化配置等。

SpringBoot自动配置原理

只要使用了 @EnableAutoConfiguration 注解就能实现自动配置。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration  
复制代码

@Import(AutoConfigurationImportSelector.class) 这个是自动配置的关键,它完成了自动配置的主要逻辑。 下面是代码的主要片段

@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
	if (!isEnabled(annotationMetadata)) {
		return NO_IMPORTS;
	}
   // 获取配置的元数据
   AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
			.loadMetadata(this.beanClassLoader);
   // 这个方法包含了加载的主要逻辑,它能找到所有自动注入的类
   AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
			autoConfigurationMetadata, annotationMetadata);
   return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
}
复制代码

下面来看 getAutoConfigurationEntry 的主要逻辑

protected AutoConfigurationEntry getAutoConfigurationEntry(
		AutoConfigurationMetadata autoConfigurationMetadata,
		AnnotationMetadata annotationMetadata) {
	// ....
	// 获取候选配置类
	List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
	// ... 过滤、去重、排除一些配置类
	return new AutoConfigurationEntry(configurations, exclusions);
}
复制代码

继续跟下去

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
			AnnotationAttributes attributes) {
   // 通过SpringFactoriesLoader获取到所有自动配置类名称
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
				getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
   return configurations;
}

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
	return EnableAutoConfiguration.class;
}
复制代码

SpringFactoriesLoader 是spring提供的一个扩展机制,它能加载模块下的 META-INF/sring.factories 文件,这个Properties格式的文件中的key是接口、注解、或抽象类的全名,value是以逗号“,"分隔的实现类。SpringFactoriesLoader能将相应的实现类注入Spirng容器中。

查看一下spring-boot-autoconfigure模块下的 META-INF/spring.factories 文件

...
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=/
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,/
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,/
...
复制代码

就可以看出来它加载哪些自动配置类;通过这个机制我们可以自己写自动配置类并且在模块下的 META-INF/spring.factories 文件中写入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=/
org.yuan.interview.springboot.XXXAutoConfiguration
复制代码

这样直接引入我们的模块就会加载 org.yuan.interview.springboot.XXXAutoConfiguration 配置类了:+1:。

如何禁用一个特定自动配置类?

方法不止一种哦

  1. 使用 @EnableAutoConfigurationexclude 属性。
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
复制代码
  1. 如果类不在类路径上,可以使用 @EnableAutoConfigurationexcludeName 属性
@EnableAutoConfiguration(excludeName={Foo.class})
复制代码
  1. 可以使用配置spring.autoconfigure.exclude属性来控制要排除的自动配置类列表。 在application.properties配置文件中配置属性,并且可以使用逗号分隔添加多个类。

什么是嵌入式服务器

嵌入式服务器是为了简化服务的部署,把web服务器的执行文件打包到jar包中通过代码直接启动,不再需要单独的服务器启动。

Spring Boot中的监视器是什么?

Spring Boot Actuator是生产级的监控实现。Spring Boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。

例如创建了什么bean、控制器中的映射、CPU 使用情况等等。

安全问题,如果存在Spring Security ,那么默认情况下使用Spring Security的内容协商策略来保护这些信息。

什么是无状态服务

微服务架构的目的之一,是通过多进程承载高并发,根据并发的压力用多个副本共同承担流量。阻碍单体架构变为分布式架构的关键点就在于状态的处理——如果状态全部保存在本地,无论在内存还是硬盘,都会给架构的 横向扩展 带来瓶颈,因为这样新启动的进程根本无法处理那些保存在原来进程的用户的数据。

所以要将整个架构分成无状态和有状态两个部分,业务逻辑的部分作为无状态的部分,很容易的横向扩展,在用户分发的时候,可以很容易分发到新的进程进行处理;状态保存在后端有状态的中间件中,如缓存、数据库、对象存储、大数据平台、消息队列等,这些中间件设计之初,就考虑了扩容时状态的迁移、复制、同步等机制,不用业务层关心。

Jpa与Hibernate的区别

JPA本身是一种规范,它的本质是一种ORM规范(不是ORM框架,因为JPA并未提供ORM实现,只是制定了规范)因为JPA是一种规范,所以,只是提供了一些相关的接口,但是接口并不能直接使用,JPA底层需要某种JPA实现,Hibernate是JPA的一个实现集。

SpringDataJpa是spring data家族的一个产品,致力于简化数据访问层的复杂程度。它实现了Jpa规范,但是底层使用了其他的开源实现,如Hibernate,OpenJpa等。

其他文章:

SpringBoot的启动流程

回见!

《面试》SpringBoot面试题

欢迎来玩呀

原文  https://juejin.im/post/5e68d21bf265da570829fbf3
正文到此结束
Loading...