主要就是上面这个getCadicateConfigurations方法,里面调用了SpringLoaderFactories.loadFactoryNames方法,从调用改方法返回值是一个configurations集合,就可以猜出该方法主要作用就是获取所有的配置类。并且在后面有加了一句:
代码语言:javascript复制No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
翻译:在META-INF/spring.factories中没有找到自动配置类。如果使用的是自定义打包,请确保该文件是正确的。
也就意味着该方法主要在META-INF/spring.factories中找到需要加载的配置类,读取所有配置类的名称:
让我们查看META-INF/spring.factories文件有什么?一、Spring缺点分析
1. 配置文件和依赖太多了!!!
spring是一个非常优秀的轻量级框架,以IOC(控制反转)和AOP(面向切面)为思想内核,极大简化了JAVA企业级项目的开发。虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。使用Spring进行项目开发需要在配置文件中写很多代码,所有这些配置都代表了开发时的损耗。
就比如下面这个图片就反映了进行数据源配置的时候配置文件有多繁琐!!!
除此之外,Spring项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。比如Spring5.0以上只能使用Junit4.12以上的版本。
下图就很好地诠释了spring框架开发的pom文件添加依赖的恐怖之处:
总结 Spring的缺点:
- 配置过于繁琐。
- 引入的依赖过多,版本控制复杂
二、什么是Spring Boot
SpringBoot对Spring的缺点进行改善和优化,基于约定大于配置的思想,简化了Spring的开发,所谓简化是指简化了Spring中大量的配置文件和繁琐的依赖引入。所以SpringBoot是一个服务于框架的框架,它不是对Spring功能的增强,而是提供了一种快速使用Spring框架的方式。
SpringBoot的优点:
- 配置简单
- 依赖引入简单
- 提供了一些大型项目的非功能特性,如嵌入式服务器,安全指标,健康监测等。
三、Spring Boot的核心功能
Spring Boot的核心功能就是起步依赖和自动装配
3.1 起步依赖
SpringBoot的依赖是基于功能的,而不是普通项目的依赖是基于JAR包的。SpringBoot将完成一个功能所需要的所有坐标打包到一起,并完成了版本适配,我们在使用某功能时只需要引入一个依赖即可。 其原理就是Maven的传递依赖,比如说a依赖b,b依赖c,c依赖d,那么如果我们引入了a依赖,剩下的b,c,d的依赖都会被加载进来。
在Spring Boot中,主要通过引入了父依赖,我们点进去看看父依赖引入了什么
我们可以看到里面继续引入了一个父依赖,我们ctrl再点击看看
Ok,我们可以看到这里声明了许多了依赖的版本,所以这也是Spring Boot引入依赖时不用声明的版本的原因,在父依赖里面都已经全部定义好了。
3.2 自动装配
SpringBoot项目自动提供最优配置,同时可以修改默值满足特定的要求。
1. 查看注解 @SpringBootApplication 的源码
@SpringBootConfiguration等同于@Configuration,代表这是一个SpringBoot的配置类,在spring中叫法是Configuration而已。
@Enable Auto Configuration代表开启自动配置功能。
2. 让我们 ctrl点击@Enable Auto Configuration,看看里面有什么
3. 从这里我们只能看出@Import注解导入了AutoConfigurationImportSelector类,现在我们再 ctrl看看AutoConfigurationImportSelector里面写了什么。
主要就是上面这个getCadicateConfigurations方法,里面调用了SpringLoaderFactories.loadFactoryNames方法,从调用改方法返回值是一个configurations集合,就可以猜出该方法主要作用就是获取所有的配置类。并且在后面有加了一句:
代码语言:javascript复制No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.
翻译:在META-INF/spring.factories中没有找到自动配置类。如果使用的是自定义打包,请确保该文件是正确的。
也就意味着该方法主要在META-INF/spring.factories中找到需要加载的配置类,读取所有配置类的名称:
让我们查看META-INF/spring.factories文件有什么?
上面配置信息就是存在大量以Configuration结尾的类名称,这里类就是存有自动配置信息的类,在SpringBootApplication获取这些类的名称后再进行加载。
让我们以ServletWebServerFactoryAutoConfiguration类为例分析源码
这里又出现了一个自动加载:@EnableConfigurationProperties({ServerProperties.class}),代表的是自动加载服务器配置类ServerProperties,再让我们ctrl点进去看看
prefix = "server",代表了Spring Boot配置文件的前缀为server,SpringBoot会将以server前缀开始的属性自动映射到该类字段中,就比如我们配置网络端口的时候设置server.port = 8080,
如果我们没有进行配置,则Spring Boot会读取默认配置信息,而默认配置信息就是放在spring-configuration-metadata.json文件中,如下图:
该文件也是存放所有的默认配置信息!!!
总结
通过起步依赖和自动装配使得进行开发时省去了很多麻烦,不用进行版本的管理,以及进行各种配置,这里在SpringBoot中全部通过自动装配一步到位。
我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!