前言
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应用。
特性:
- 不需要使用XML配置。
- 提供stater简化构建配置。
- 自动配置spring与第三方库集成。
- 嵌入式web服务让部署更加便捷。
- 提供生产级的特性,如监控、健康检查、外部化配置等。
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
配置类了👍。
如何禁用一个特定自动配置类?
方法不止一种哦
- 使用
@EnableAutoConfiguration
的exclude
属性。
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
复制代码
- 如果类不在类路径上,可以使用
@EnableAutoConfiguration
的excludeName
属性
@EnableAutoConfiguration(excludeName={Foo.class})
复制代码
- 可以使用配置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等。
最新2021整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法以及最新的简历模板等学习资料,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友扫描下方二维码免费获取:暗号:【CSDN】
看完三件事❤️
如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
-
点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
-
关注公众号 『 java烂猪皮 』,不定期分享原创知识。
-
同时可以期待后续文章ing🚀
-
.关注后回复【666】扫码即可获取学习资料包