美文网首页微服务
@EnableRedisHttpSession注解,redis自

@EnableRedisHttpSession注解,redis自

作者: 墨色尘埃 | 来源:发表于2019-11-21 18:05 被阅读0次

接上篇 项目中redis的集成,并自动连接

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

ImportAware接口是需要和@Import一起使用的。在@Import作为元注解使用时,通过@Import导入的配置类如果实现了ImportAware接口就可以获取到导入该配置类接口的数据配置。有点绕,我们直接上代码。 Spring的@Import注解与ImportAware接口

  1. 进入JedisConnectionFactory,创建connectionFactory
    很是奇怪,这个connectionFactory从哪里来的?于是进入RedisConnectionFactory接口,F4查看该接口的结构关系。有四个实现类,这里断点跟踪是进入JedisConnectionFactory
image.png

我们知道,java执行顺序是:父类静态块-->子类静态块-->父类非静态块-->父类构造方法-->子类非静态块-->子类构造方法

JedisConnectionFactory类,该类实现了InitializingBean接口。
InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候都会执行该方法。
在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。
Spring应用--实现InitializingBean接口

这里JedisConnectionFactory类执行顺序是:成员变量-->构造方法-->afterPropertiesSet()方法
JedisConnectionFactory有多个构造函数,这里执行第四个构造函数

image.png

第四个构造函数

   public JedisConnectionFactory(RedisSentinelConfiguration sentinelConfig, JedisPoolConfig poolConfig) {
       this.sentinelConfig = sentinelConfig;
       this.poolConfig = poolConfig != null ? poolConfig : new JedisPoolConfig();
   }

执行完这个构造函数,是否就可以认为spring已经注入了JedisConnectionFactory对象呢??

Spring整合Redis之ConnectionFactory从何而来?

  1. 继续执行,进入 RedisHttpSessionConfiguration类的sessionRedisTemplate方法中。该方法入参为 RedisConnectionFactory,该入参是否为上一步注入的JedisConnectionFactory对象呢??
image.png
  1. 继续执行,进入RedisConfig配置类的redisTemplate方法中


    image.png

这里暂停一下:看3、4步,两者都是注入RedisTemplate<Object, Object>,入参也一样,不同的是3步是依赖包里的,4步是自定义的,第4步是否覆盖了第3步的注入呢?

RedisHttpSessionConfiguration类中@Bean的注入顺序:

sessionRedisTemplate--> sessionRepository --> redisMessageListenerContainer -->enableRedisKeyspaceNotificationsInitializer

image.png image.png image.png image.png

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

image.png

相关文章

网友评论

    本文标题:@EnableRedisHttpSession注解,redis自

    本文链接:https://www.haomeiwen.com/subject/oestwctx.html