

- 打断点运行,首先进入ImportAware接口的
setImportMetadata
方法中,获取到RedisHttpSessionConfiguration配置类的数据配置

ImportAware接口是需要和@Import一起使用的。在@Import作为元注解使用时,通过@Import导入的配置类如果实现了ImportAware接口就可以获取到导入该配置类接口的数据配置。有点绕,我们直接上代码。 Spring的@Import注解与ImportAware接口
- 进入JedisConnectionFactory,创建connectionFactory
很是奇怪,这个connectionFactory
从哪里来的?于是进入RedisConnectionFactory
接口,F4查看该接口的结构关系。有四个实现类,这里断点跟踪是进入JedisConnectionFactory
类

我们知道,java执行顺序是:父类静态块-->子类静态块-->父类非静态块-->父类构造方法-->子类非静态块-->子类构造方法
JedisConnectionFactory类,该类实现了
InitializingBean
接口。
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。
在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。
Spring应用--实现InitializingBean接口
这里JedisConnectionFactory类执行顺序是:成员变量-->构造方法-->afterPropertiesSet()方法
JedisConnectionFactory有多个构造函数,这里执行第四个构造函数

第四个构造函数
public JedisConnectionFactory(RedisSentinelConfiguration sentinelConfig, JedisPoolConfig poolConfig) {
this.sentinelConfig = sentinelConfig;
this.poolConfig = poolConfig != null ? poolConfig : new JedisPoolConfig();
}
执行完这个构造函数,是否就可以认为spring已经注入了JedisConnectionFactory对象呢??
Spring整合Redis之ConnectionFactory从何而来?
- 继续执行,进入 RedisHttpSessionConfiguration类的
sessionRedisTemplate
方法中。该方法入参为RedisConnectionFactory
,该入参是否为上一步注入的JedisConnectionFactory对象呢??

-
继续执行,进入RedisConfig配置类的redisTemplate方法中
image.png
这里暂停一下:看3、4步,两者都是注入RedisTemplate<Object, Object>,入参也一样,不同的是3步是依赖包里的,4步是自定义的,第4步是否覆盖了第3步的注入呢?
RedisHttpSessionConfiguration类中@Bean的注入顺序:
sessionRedisTemplate--> sessionRepository --> redisMessageListenerContainer -->enableRedisKeyspaceNotificationsInitializer




enableRedisKeyspaceNotificationsInitializer方法中,
new EnableRedisKeyspaceNotificationsInitializer(connectionFactory,this.configureRedisAction)
EnableRedisKeyspaceNotificationsInitializer是一个静态类,并实现了InitializingBean接口

网友评论