SpringBoot是现在使用是如此的广泛,几乎所有的后端面试官都会就它的使用和基本原理方面进行考察。
Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run".
SpringBoot是Spring基金会下的子项目,是Spring组件一站式解决方案,通过自动配置提供了各种stater,简化了大量的配置工作。 从而使开发者能够快速的搭建生产级Spring应用。
特性:
只要使用了 @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:。
方法不止一种哦
@EnableAutoConfiguration
的 exclude
属性。 @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) 复制代码
@EnableAutoConfiguration
的 excludeName
属性 @EnableAutoConfiguration(excludeName={Foo.class}) 复制代码
嵌入式服务器是为了简化服务的部署,把web服务器的执行文件打包到jar包中通过代码直接启动,不再需要单独的服务器启动。
Spring Boot Actuator是生产级的监控实现。Spring Boot监视器可帮助您访问生产环境中正在运行的应用程序的当前状态。
例如创建了什么bean、控制器中的映射、CPU 使用情况等等。
安全问题,如果存在Spring Security ,那么默认情况下使用Spring Security的内容协商策略来保护这些信息。
微服务架构的目的之一,是通过多进程承载高并发,根据并发的压力用多个副本共同承担流量。阻碍单体架构变为分布式架构的关键点就在于状态的处理——如果状态全部保存在本地,无论在内存还是硬盘,都会给架构的 横向扩展 带来瓶颈,因为这样新启动的进程根本无法处理那些保存在原来进程的用户的数据。
所以要将整个架构分成无状态和有状态两个部分,业务逻辑的部分作为无状态的部分,很容易的横向扩展,在用户分发的时候,可以很容易分发到新的进程进行处理;状态保存在后端有状态的中间件中,如缓存、数据库、对象存储、大数据平台、消息队列等,这些中间件设计之初,就考虑了扩容时状态的迁移、复制、同步等机制,不用业务层关心。
JPA本身是一种规范,它的本质是一种ORM规范(不是ORM框架,因为JPA并未提供ORM实现,只是制定了规范)因为JPA是一种规范,所以,只是提供了一些相关的接口,但是接口并不能直接使用,JPA底层需要某种JPA实现,Hibernate是JPA的一个实现集。
SpringDataJpa是spring data家族的一个产品,致力于简化数据访问层的复杂程度。它实现了Jpa规范,但是底层使用了其他的开源实现,如Hibernate,OpenJpa等。
其他文章:
SpringBoot的启动流程回见!
欢迎来玩呀