RedisAutoConfiguration(Redis场景定制)

@AutoConfiguration
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
@Import({LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class})
public class RedisAutoConfiguration {
    public RedisAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean(
        name = {"redisTemplate"}
    )
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }

    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        return new StringRedisTemplate(redisConnectionFactory);
    }
}

RedisAutoConfiguration类上的注解

一、@AutoConfiguration

自动配置类注解

是一个组合注解,组合中的注解有:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration(
    proxyBeanMethods = false
)
@AutoConfigureBefore
@AutoConfigureAfter

前三个元注解

@Target( {ElementType.TYPE})

该注解说明了注解修饰的对象范围,也就是注解可以使用的地方。

其取值有:

1、CONSTRUCTOR:用于描述构造器
2、FIELD:用于描述域
3、LOCAL_VARIABLE:用于描述局部变量
4、METHOD:用于描述方法
5、PACKAGE:用于描述包
6、PARAMETER:用于描述参数
7、TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention(RetentionPolicy.RUNTIME)

该注解用来修饰注解的生命周期。

其取值有:

1、SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;
2、CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期;
3、RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;

@Documented

该注解用于生成JavaDoc文档。

其他三个注解

@Configuration(proxyBeanMethods = false)

该注解为配置类注解,是@Component注解的扩展注解,相当于xml配置文件,配置类本身也是组件。

而且在这里使用的是轻加载。

@AutoConfigureBefore

一般配合@Component注解使用,表明在某类加载后再执行该配置类

@AutoConfigureAfter

表明在某类加载之前执行该配置类

二、@ConditionalOnClass( {RedisOperations.class})

该注解下有四个注解,前三个是元注解。

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional({OnClassCondition.class})

@Conditional( {OnClassCondition.class})

该注解为条件装配,按照设定的条件进行判断,把满足判断条件的bean注册到Spring容器。

所以该注解@ConditionalOnClass({RedisOperations.class})意为当项目中存在RedisOperations类时,该注解下的RedisAutoConfiguration类才会生效

三、@EnableConfigurationProperties( {RedisProperties.class})

该注解下有四个注解

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({EnableConfigurationPropertiesRegistrar.class})

其中前三个为元注解。

@Import( {EnableConfigurationPropertiesRegistrar.class})

该注解用于导入组件。

@EnableConfigurationProperties({RedisProperties.class}) 意为使使用了@ConfigurationProperties()的类生效,本处就是使RedisProperties类生效。

RedisProperties类中确实使用了@ConfigurationPropertie()

@ConfigurationProperties(
    prefix = "spring.redis"
)
public class RedisProperties {
.....

RedisAutoConfiguration类中方法上的注解

@Bean
@ConditionalOnMissingBean(
    name = {"redisTemplate"}
)
......
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
......
@Bean
@ConditionalOnMissingBean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)

@Bean

注册bean对象。声明当前方法的返回值是一个 Bean。

@ConditionalOnMissingBean(name = {"redisTemplate"})

修饰bean的一个注解,当bean被注册到IOC容器后之后,如果又注册了相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个。

@ConditionalOnSingleCandidate(RedisConnectionFactory.class)

表示当指定的RedisConnectionFactory类已注册到容器中,且是单例时则将该注解下的Bean注入到IOC容器中。

image-20230422190612110
image-20230422190612110