每日一学:集成 redis,xxx-starter.jar的原理,自定义 starter

SpringBoot 集成 redis

  1. 首先引入 spring-boot-starter-data-redis,注意 springboot 1.X 该 package 名为 spring-boot-starter-redis,还要引入连接池 org.apache.commons.commons-pool2;

  2. application.properties 引入配置,注意 springboot 1.x版本中前缀为 spring.redis.pool,使用的是 jedis 作为连接池,而 2.x 前缀是 spring.redis.lettuce.pool,采用 lettuce 作为连接池;

	spring.redis.host=localhost
	spring.redis.port=6379
	spring.redis.lettuce.pool.max-idle=8
	spring.redis.lettuce.pool.max-active=8
	spring.redis.lettuce.pool.max-wait=-1ms
	spring.redis.lettuce.pool.min-idle=0
	spring.redis.lettuce.shutdown-timeout=100ms
  1. 单元测试:
	@Autowired
	private StringRedisTemplate stringRedisTemplate;
	@Test
	public void test(){
		// 待补充
	}

xxx-starter.jar 的原理

  1. 首先需要 spring-boot-autoconfigure 的 jar 和 xxx-starter 的 jar,在 springboot 启动时,@SpringBootApplication 注解中包含 @EnableAutoConfiguration,这个注解会在 classpath 下,查找所有 META-INF/ 目录下的 spring.factories 的文件,然后扫描需要自动配置的类;
	应用默认只会扫描启动类所在 package 和其下级的 package 下的 @Configuration 修饰的类,其中 @Configuration 修饰类中的 @bean 会被AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 进行扫描,加载到 ioc 容器中;
  1. 在 spring-boot-autoconfigure.jar 中的 spring.factories 可以找到 org.springframework.boot.autoconfigure.EnableAutoConfiguration = RedisAutoConfiguration 的 redis 配置类;

  2. 以 redis 为例,查看 RedisAutoConfiguration,首先是 @ConditionalOnClass({RedisOperations.class}),表示需要 RedisOperations 才会加载该配置类,而 RedisOperations 就存在 spring-boot-starter-data-redis 的 jar 中,因此只有引入 spring-boot-starter-data-redis 才会让 RedisAutoConfiguration 生效;

  3. 然后在 RedisAutoConfiguration 发现 @EnableConfigurationProperties({RedisProperties.class}) 表示需要生成 RedisProperties 的实例,该实例就是用来读取 yaml 中的配置属性,如 spring.redis.host 等;

	// 来获取 yaml 中配置信息
	@ConfigurationProperties(	prefix = "spring.redis" )
	public class RedisProperties 
  1. 在 RedisAutoConfiguration 还找到 @Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class}) 表示会在 ioc 构造对应的 bean,是按照 import 顺序来构造的;

  2. import 引入的 LettuceConnectionConfiguration,这里会用到之前构造的 RedisProperties,并且 @Bean 会创建 redisConnectionFactory(获取 redis 连接的工厂类),factory 的构造过程中就会使用 RedisProperties 中的 pool,然后根据是否配置 yaml 中的相关属性来决定使用单机,哨兵或者集群模式;

	JedisConnectionConfiguration 和 RedisAutoConfiguration 的功能类似,并且运行时是按顺序执行的,所以只有 LettuceConnectionConfiguration 生效,因为 @ConditionalOnMissingBean({RedisConnectionFactory.class}) 的作用;
  1. 最后 RedisAutoConfiguration 配置了 @Bean 修饰的 RedisTemplate 和 StringRedisTemplate,应用就可以使用了;

自定义 starter

  1. 新建一个项目,引入 spring-boot-autoconfigure 和相关 jar,新建配置读取类 xxxProperties,添加 @ConfigurationProperties(prefix = “xxx.xxx”) 来读取配置信息;

  2. 新建自动化配置类 xxxConfiguration,使用 @Configuration 修饰,添加 @EnableConfigurationProperties(xxxProperties.class) 来实例化配置类,添加需要自定义配置的 bean;

  3. 新建 src/main/resources/META-INF/spring.factories 文件,添加 org.springframework.boot.autoconfigure.EnableAutoConfiguration
    = com.auto.config.MyRedisAutoConfiguration;

  4. 即完成所有配置,推荐阅读:https://blog.csdn.net/yeyinglingfeng/article/details/87790700;

你可能感兴趣的:(每日一学,spring,boot,java,spring,redis)