https://sdqali.in/blog/2016/07/16/controlling-redis-auto-configuration-for-spring-boot-session/
常用的類:
@ConditionalOnProperty(name = "use.redis.session.store", havingValue = "true") @ConditionalOnClass(Session.class) @AutoConfigureAfter(RedisAutoConfiguration.class) @ConditionalOnWebApplication @ConditionalOnMissingBean(RedisHttpSessionConfiguration.class) @SpringBootApplication(exclude ={SessionAutoConfiguration.class})
舉例:以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,則加上構造函數
public MybatisAutoConfiguration(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 的構造函數上,查看調用棧,便可以看出端倪
