springboot自定义配置应用详解

Posted Fire king

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot自定义配置应用详解相关的知识,希望对你有一定的参考价值。

springboot自定义配置应用详解

1.springboot自定义配置的几种实现方法:

  1. 新生成一种自动配置
  2. 针对已有的自动配置类配置的一些bean修改
  3. 针对已有的自动配置类的属性的值做修改

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)属性取值

  1. .XXXProperties.class+ prefix = "XXX.XXX"
@ConfigurationProperties(
    prefix = "spring.rabbitmq" //yml或者properties文件里面属性的前缀,前缀加具体属性名就对应RabbitProperties 的属性名,值自然而然也会取到
)
public class RabbitProperties 

  1. XXXProperties.class+@Value(“$yiml文件全属性名”)
public class RabbitProperties 
@Value("$yiml文件全属性名")
private String xxx;

  1. 最粗糙的方法:直接在需要取值的属性名上加@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;
    

与50位技术专家面对面 20年技术见证,附赠技术全景图

以上是关于springboot自定义配置应用详解的主要内容,如果未能解决你的问题,请参考以下文章

详解Springboot中自定义SpringMVC配置

springboot手写自定义配置

springboot系列配置文件详解

springboot系列配置文件详解

SpringBoot中配置文件详解(ymlproperties全局配置和自定义配置),获取配置方式

SpringBoot 配置文件详解