一、SpringBoot的starter简介
1.1 什么是starter(场景启动器)
在SpringBoot出现之前,如果我们想使用SpringMVC来构建我们的web项目,必须要做的几件事情如下:
-
首先项目中需要引入SpringMVC的依赖
-
在web.xml中注册SpringMVC的
DispatcherServlet
,并配置url映射 -
编写
springmcv-servlet.xml
,在其中配置SpringMVC中几个重要的组件,处理映射器(HandlerMapping)、处理适配器(HandlerAdapter)、视图解析器(ViewResolver) -
在
applicationcontext.xml
文件中引入springmvc-servlet.xml
文件 -
…
以上这几步只是配置好了SpringMVC,如果我们还需要与数据库进行交互,就要在application.xml中配置数据库连接池DataSource,如果需要数据库事务,还需要配置TransactionManager…
这就是使用Spring框架开发项目带来的一些的问题:
-
依赖导入问题:每个项目都需要来单独维护自己所依赖的jar包,在项目中使用到什么功能就需要引入什么样的依赖。手动导入依赖容易出错,且无法统一集中管理
-
配置繁琐:在引入依赖之后需要做繁杂的配置,并且这些配置是每个项目来说都是必要的,例如web.xml配置(Listener配置、Filter配置、Servlet配置)、log4j配置、数据库连接池配置等等。这些配置重复且繁杂,在不同的项目中需要进行多次重复开发,这在很大程度上降低了我们的开发效率
而在SpringBoot出现之后,它为我们提供了一个强大的功能来解决上述的两个痛点,这就是SpringBoot的starters(场景启动器)。
Spring Boot通过将我们常用的功能场景抽取出来,做成的一系列场景启动器,这些启动器帮我们导入了实现各个功能所需要依赖的全部组件,我们只需要在项目中引入这些starters,相关场景的所有依赖就会全部被导入进来,并且我们可以抛弃繁杂的配置,仅需要通过配置文件来进行少量的配置就可以使用相应的功能。
二、SpringBoot场景启动器的原理
在导入的starter之后,SpringBoot主要帮我们完成了两件事情:
-
相关组件的自动导入
-
相关组件的自动配置
这两件事情统一称为SpringBoot的自动配置
2.1 自动配置原理
2.1.1 自动配置类的获取与注入
我们从主程序入口来探索一下整个过程的原理:
@SpringBootApplication //标注这个类是一个springboot的应用 public class CommunityApplication { public static void main(String[] args) { //将springboot应用启动 SpringApplication.run(CommunityApplication.class, args); } }
@SpringBootApplication
注解内部结构如下图所示:
AutoConfigurationImportSelector
:重点看该类中重写的selectImports方法,看下它返回的字符串数组是如何得来的:
我们可以去到上边提到的 spring.factories
文件中去看一下,找到spring官方提供的 spring-boot-autoconfigure
包,在其下去找一下该文件:
可以看到这个就是SpringBoot官方为我们提供的所有自动配置类的候选列表。我们可以在其中找到一个我们比较熟悉的自动配置类去看一下它内部的实现:
可以看到这些一个个的都是JavaConfig配置类,而且都通过 @Bean
注解向容器中注入了一些Bean
结论:
-
SpringBoot在启动的时候从类路径下的
META-INF/spring.factories
中获取EnableAutoConfiguration指定的所有自动配置类的全限定类名 -
将这些