现在,问题来了,刚才那个项目那么简单,那个,整个项目的启动过程中,到底发生了哪些魔法呢?
我们将 Groovy 的代码翻译为 Java版本,大概会看到,一个项目想要启用 Spring Boot,关键在于 SpringApplication
类和 EnableAutoConfiguration
注解的使用。
SpringApplication 是 Spring Boot 提供的用于 Java main 方法的启动类。它的执行操作首先为:
- Create an appropriate {@link ApplicationContext} instance (depending on your classpath)
- Register a {@link CommandLinePropertySource} to expose command line arguments as Spring properties
- Refresh the application context, loading all singleton beans Trigger any {@link CommandLineRunner} beans
然后 EnableAutoConfiguration
则为 Enable 类注解这里通过此注解,告诉 Spring Boot 开启自动装配的特性。
除了 EnableAutoConfiguration
,我们常常和它并列使用的还有 ComponentScan
Configuration
注解。这三个注解合起来,有一个等价的注解,叫做 SpringBootApplication
,一般在我们的项目开发中,喜欢在项目最外面的包下面创建包含 main 方法的程序启动类,然后这个类上标记为 @SpringBootApplication 这个注解,这样就等价于基于 main 方法类所在的 package 为 Spring 扫包的基础包路径,且开启自动化配置。
自动化配置的实现,不得不说 Spring Boot 本质上是通过 Conditional 类注解来实现的。
@ConditionalOnClass
表示对应的类在classpath目录下存在时,才会去执行注解所标示的自动配置类或者自动配置方法,与之对应的我们就@ConditionalOnMissingClass 注解,也就是找不到对应的类的时候。
@ConditionalOnBean
和 @ConditionalOnMissingBean
则同样很容易按照字面意思理解。
当然 Conditional*
注解不仅仅上面提到的这些,还有 ConditionalOnExpression
一类的。
这个是我们从 Spring Boot 当中节选的一段代码,主要是为了演示自动化配置的具体实现。首先我们在项目配置里面标明 spring.jmx.enabled = true,ConditionalOnProperty 注解生效,然后 Spring 发现能找到 MBeanExporter.class
这个类,于是开始执行自动化配置的方法,因为这个时候项目中没有定义 MBeanExporter
这个 Bean,于是 ConditionalOnMissingBean
注解生效,Spring 开始读取配置属性,自动创建此 Bean 对象。
同理,任何一个自动装配的实现,基本上就是组合这些条件注解。
当然,如果能被 Spring Boot 官方直接支持的话是最吼的,目前被支持的肯定不止上面这些,我只是简单地列举了一些常见的项目。
Spring Boot 官方之前发起过好几次投票,就是列举一些框架,然后大家投票选择哪些想要被官方支持的。上半年的时候,我还在里面看到了之前姜老师维护的 camel,然而似乎并没有被选中。MyBatis 目前虽然有 Spring Boot 版,但是是由 MyBatis 团队自行维护,至少我6月份尝试使用的时候,问题还是蛮多的。 (2017年之后的版本基本可用,主要是有了 Boot 版本的 VFS)
上面是我从 Spring Boot 1.3.6 中找到的 spring.factories 文件的截图。当然,基本上只要上面有的,都能得到不错的支持。
讲得好!