springboot自定义配置应用详解
1.springboot自定义配置的几种实现方法:
- 新生成一种自动配置
- 针对已有的自动配置类配置的一些bean修改
- 针对已有的自动配置类的属性的值做修改
2.一些可能会用到的注解:
@EnableConfigurationProperties({XXXProperties.class})
@Import({XXXConfiguration.class,XXXConnectionConfiguration.class})
@EnableConfigurationProperties({XXXProperties.class})
标注在某个Configuration类上,可以将XXXProperties.class
封装的一些属性的值传递给被此注解标注的Configuration类
,具体使用可以是在某个方法的入参注入如XXXProperties.class properties
,同时@Import({XXXConfiguration.class,XXXConnectionConfiguration.class})
和@EnableConfigurationProperties({XXXProperties.class})
标注在同一个Configuration类上也可以协同作用,具体用法是@Import({XXXConfiguration.class,XXXConnectionConfiguration.class})中的XXXConfiguration.class
或者XXXConnectionConfiguration.class
类中的方法也跟上面一样在入参中传入XXXProperties.class properties
。
3.自定义配置类参考模板
最后,针对2写出一个XXXConfiguration.class的模板如下:
@Configuration
@EnableConfigurationProperties({XXXProperties.class})//可以可无,不过建议写,高端一点
@Import({XXXConfiguration.class,XXXConnectionConfiguration.class}) //可有可无,主要是想让导入的类使用@EnableConfigurationProperties({XXXProperties.class})的XXXProperties.class的属性
public class XXXConfiguration {
@Bean
//自定义返回的bean,可以通过注入XXXProperties.class和XXXConfiguration.class以及XXXConnectionConfiguration.class达到自定义bean的属性来实现自定义配置类。
}
4.属性赋值
Configuration类
和@Import({XXXConfiguration.class,XXXConnectionConfiguration.class})
属性取值
.XXXProperties.class
+prefix = "XXX.XXX"
@ConfigurationProperties(
prefix = "spring.rabbitmq" //yml或者properties文件里面属性的前缀,前缀加具体属性名就对应RabbitProperties 的属性名,值自然而然也会取到
)
public class RabbitProperties {
}
- XXXProperties.class+@Value(“${yiml文件全属性名}”)
public class RabbitProperties {
@Value("${yiml文件全属性名}")
private String xxx;
}
- 最粗糙的方法:直接在需要取值的属性名上加@Value(“${yiml文件全属性名}”)
5.技巧
自定义技巧:针对自动配置中属性默认值为某个类对象,若想换成其他实现,可以寻找知道能看到类似命名的实现类的抽象类即可。
自定义配置也可以在自动配置之后,以此做修改:
@EnableCaching
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
@Slf4j
public class RedisConfiguration {
*/
/**
* 配置自定义redisTemplate
*
* @param connectionFactory
* @return
*//*
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setValueSerializer(jackson2JsonRedisSerializer()); //使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(jackson2JsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jackson2JsonRedisSerializer());
template.afterPropertiesSet();
log.info("加载Redis模板方法:{}", template.getClass());
return template;
}
*/
/**
* json序列化
*
* @return
*//*
@Bean
public RedisSerializer<Object> jackson2JsonRedisSerializer() { //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
serializer.setObjectMapper(mapper);
log.info("加载Redis序列化方法:{}", serializer.getClass());
return serializer;
}
*/
/**
* 配置缓存管理器
*
* @param redisConnectionFactory
* @return
*//*
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { // 生成一个默认配置,通过config对象即可对缓存进行自定义配置
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); // 设置缓存的默认过期时间,也是使用Duration设置
config = config.entryTtl(Duration.ofMinutes(1)) // 设置 key为string序列化
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 设置value为json序列化
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer())) // 不缓存空值
.disableCachingNullValues(); // 设置一个初始化的缓存空间set集合
RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory) // 一定要先调用该方法设置初始化的缓存名,再初始化相关的配置
//.initialCacheNames(cacheNames)
//.withInitialCacheConfigurations(configMap)
.build();
log.info("加载Redis缓存管理器:{}", cacheManager.getClass());
return cacheManager;
}
}