美文网首页微服务
@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