简介
众所周知spring通过一些默认配置帮我们简化了一些配置,集成了许多优秀的框架,接下来探究其中的原理。
自动配置
(1)首先我们看一下springboot的启动类注解@SpringBootApplication,他是如何去集成外部配置和默认配置的。
接下来咱们重点看@SpringBootConfiguration和@EnableAutoConfiguration注解
(2)@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,
并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
(3)那么问题来,到底是扫描哪些包把什么地方的配置,外部的框架类似于mybatis又是怎么约定的,关键就在于@EnableAutoConfiguration,下面咱们来看看这个注解干了哪些事情。
AutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。
在AutoConfigurationImportSelector类中可以看到通过 SpringFactoriesLoader.loadFactoryNames()
把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都加载到容器中。
demo演示
(1)首先新建一个空的maven工程,创建两个子工程,其中start-consumer是演示使用start,是一个web工程,start-product是一个普通的工程,用于start提供。我们知道一个普通的工程是不能直接把对象注入到spring的,但是start-consumer是一个web工程,引入start-product的jar,当start-consumer启动时会检测到META-INF/spring.factories文件,发现该文件中配置ProductAutoConfigure的类路径,而且ProductAutoConfigure被@Configuration标注了加入了spring,同时还有个被 @Bean标注的方法helloService也同时被spring管理,所以start-consumer就可以依赖注入这个bean。