我们在使用 Spring Boot 的过程中, 往往都是在 pom.xml 里加了一系列的依赖, 然后启支一个包含 main 方法的 Application, 一切就 OK 啦. 给你我的感觉, 就像是自己要动手做个菜, 自己不再需要准备每一部分的原材料, 直接购买包装好的一份菜的原料, 下锅即可.
那我们详细看下, 这份「包装好」的原料中, 到底做了些什么.
添加 Starter 依赖
这里添加的依赖, 除了我们之前在 Maven 中熟悉的之外, 还有一些都是长这个样子:
名为 xxx-starter, 比如
具体这些 starter 是怎么起作用的呢, 他们什么时候开始工作的?
一切都要从入口处说起. 我们以上面的 starter 为例, 看到这个 mybatis 的 starter, 其对应的 pom 中, 包含这些依赖
我们看到, 相当于我们添加了一个 Starter 的依赖, 其背后会引入许多其定义的其他依赖, 通过 Maven 的传递依赖, 这些都会被自动添加了进来.
自动配置
相比传统的依赖, 我们看到其中包含这样一个: mybatis-spring-boot-autoconfigure, 这也是每个 Starter 的秘密所在:「AutoConfigure」
它会在实现时, 考虑应用中的其他部分因素,「推断」你所需要的 Spring 配置.
在 Spring Boot 中, 我们最大的感受是配置仿佛都被做好了, 直接使用即可, 这就是
spring-boot-autoconfigure. 每个 starter 都有一个名为 spring.factories
的文件, 存放在 META-INF 目录下, 其中的内容类似下面这个样子:
所有需要自动配置的 Class, 都需要配置成 key 是 EnableAutoConfiguration 的.
我们来看类的内部
Class 之上, 有不少注解来标识, 有几点需要关注的:
其中有标准的 Spring 配置注解 @Configuration
几个 @ConditionalXX
标识执行顺序的 @AutoConfigureAfter
其中,@ConditionalOnClass 标识 SqlSessionFactory 类存在时, 执行该配置, @ConditionalOnBean 标识 DataSource Bean 在 Spring Context 时, 执行配置.
这些 spring.factories 是怎么被识别的呢? 这就得夸下 Spring 的 FactoriesLoader 了.
看下官方文档说明
启动的时候, 根据 ClassLoader 中的 jar, 扫描所有 spring.factories, 将其中符合条件的过滤出来, 执行对应的配置. 重点可以关注下
AutoConfigurationImportFilter 类,
,
经过这里的执行之后, filter 方法把符合条件的过滤出来了.
创建自定义 Starter
经过上面两步, 我们大概知道 Starter 的工作原理. 有时候, 我们需要对外提供一些工具组件时, 也想以 Starter 的形式提供出来, 供别人使用. 步骤也还算清晰, 照葫芦画瓢.
先创建自己的模块
增加需要用到的依赖
创建对应的 AutoConfiguration 类
创建 META-INF/spring.factories 文件
此时, 就不需要再将 Spring Boot 做为 Parent 依赖, 在单独的依赖中增加
AutoConfiguration 类也简单, 照上面的创建一个
然后, 增加文件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.demo.HelloServiceAutoConfiguration
在需要这个服务的地方, 直接引入依赖就 OK 啦.
来源: http://www.jianshu.com/p/7d2aff488e6d