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容器中。