Spring Boot 的自动化配置极大地简化了我们的开发,这也是 Spring Boot 能够一统 Java EE 江湖的重要原因之一。Spring Boot 在启动的时候,会把常用的组件全部导入到 Spring 的 ioc 容器中,当然,缓存管理器(CacheManager)也不例外。
什么是缓存管理器
缓存管理器(CacheManager) 定义了创建、配置、获取、管理和控制多个唯一命名的 Cache,这些 Cache 存在于CacheManager 的上下文中。
自动配置原理
接下来我们来看一下默认的缓存管理器是如何导入的,这是 Spring Boot 自动配置包下的 RedisCacheConfiguration 类的源码。
1.首先可以看到这个类标注了@ConditionalOnMissingBean 注解,只有在容器中没有 CacheManager 这个类的对象的时候,才为我们自动创建。
2.这个类通过 cacheManager 方法来为我们创建 RedisCacheManager 对象。具体是怎么创建的呢?我们继续看源码可知,它要通过 RedisCacheManager 的静态方法 builder() 方法先创建一个 RedisCacheManagerBuilder 对象,我们点进 RedisCacheManager 类,找到 builder() 方法,发现它有两种重载的形式,参数分别是 RedisConnectionFactory 和 RedisCacheWriter,我们可以通过这两种方式创建 RedisCacheManagerBuilder 对象。
public class RedisCacheManager extends AbstractTransactionSupportingCacheManager {
public static RedisCacheManagerBuilder builder(RedisConnectionFactory connectionFactory) {
Assert.notNull(connectionFactory, "ConnectionFactory must not be null!");
return RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory);
}
/**
* Entry point for builder style {@link RedisCacheManager} configuration.
*
* @param cacheWriter must not be {@literal null}.
* @return new {@link RedisCacheManagerBuilder}.
*/
public static RedisCacheManagerBuilder builder(RedisCacheWriter cacheWriter) {
Assert.notNull(cacheWriter, "CacheWriter must not be null!");
return RedisCacheManagerBuilder.fromCacheWriter(cacheWriter);
}
}
3.拿到 RedisCacheManagerBuilder 之后,调用 build() 方法,我们继续点进 RedisCacheManagerBuilder 类,发现这个类是 RedisCacheManager 的一个静态内部类,这个类定义了 build() 方法,返回一个 RedisCacheManager 对象。
public static class RedisCacheManagerBuilder {
private final RedisCacheWriter cacheWriter;
private RedisCacheConfiguration defaultCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
private final Map<String, RedisCacheConfiguration> initialCaches = new LinkedHashMap<>();
private boolean enableTransactions;
boolean allowInFlightCacheCreation = true;
/**
* Create new instance of {@link RedisCacheManager} with configuration options applied.
*
* @return new instance of {@link RedisCacheManager}.
*/
public RedisCacheManager build() {
RedisCacheManager cm = new RedisCacheManager(cacheWriter, defaultCacheConfiguration, initialCaches,
allowInFlightCacheCreation);
cm.setTransactionAware(enableTransactions);
return cm;
}
}
由此可见,RedisCacheManager 对象的创建过程使用了建造者模式,通过 RedisCacheManagerBuilder 这个建造者来生产具体的产品 RedisCacheManager。
4.最后通过参数 cacheManagerCustomizers 调用 customize() 方法,将之前得到的 RedisCacheManager 对象作为参数传入到 customize() 方法中做最后的处理,把最后得到的 RedisCacheManager 对象加入到容器中,这就是默认缓存管理器的配置原理。