Spring Boot 2.x 缓存管理器自动配置原理

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 对象加入到容器中,这就是默认缓存管理器的配置原理。

发布了47 篇原创文章 · 获赞 102 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/MarcoAsensio/article/details/104298557
今日推荐