SpringBoot自動配置xxxAutoConfiguration 的使用
以MybatisAutoConfiguration為例
1. 在jar包中/META-INF/spring.factories中配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
spring在啟動時會去自動加載這個bean
2. MybatisAutoConfiguration.java上加上@Configuration
3. 如果需要通過自定義構造函數來構造bean,則加上構造函數
publicMybatisAutoConfiguration(MybatisProperties properties, ObjectProvider<Interceptor[]> interceptorsProvider, ResourceLoader resourceLoader, ObjectProvider<DatabaseIdProvider> databaseIdProvider, ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider) { this.properties = properties; this.interceptors = interceptorsProvider.getIfAvailable(); this.resourceLoader = resourceLoader; this.databaseIdProvider = databaseIdProvider.getIfAvailable(); this.configurationCustomizers = configurationCustomizersProvider.getIfAvailable(); }
構造函數中依賴的Bean,Spring會自動從Spring beanFactory容器中去找到適配的bean來傳入
參數:
MybatisProperties properties --> 依賴MybatisProperties 這個bean,而MybatisProperties 是一個@ConfigurationProperties。則加上@EnableConfigurationProperties(MybatisProperties.class),讓bean MybatisProperties 先加載
ObjectProvider<Interceptor[]> interceptorsProvider --> 依賴 org.apache.ibatis.plugin.Interceptor[],但又不確定 Interceptor 的bean是否存在,則通過ObjectProvider<Interceptor[]> 去獲取,interceptorsProvider.getIfAvailable()
ResourceLoader resourceLoader --> 依賴 bean ResourceLoader,直接在 Spring 容器中找到相應的 bean
ObjectProvider<DatabaseIdProvider> databaseIdProvider --> 同上
ObjectProvider<List<ConfigurationCustomizer>> configurationCustomizersProvider --> 同上
附:斷點打在MybatisAutoConfiguration 的構造函數上,查看調用棧,便可以看出端倪
SpringBoot自動配置xxxAutoConfiguration 的使用