springboot多模块项目子模块加载application.properties

springboot多模块项目会将一些通用的功能提取出来作为一个子模块,比如常见的dao模块、redis模块。
不是多模块项目时,我们在application.properties中配置信息会在项目启动时自动加载配置,能够自动加载配置的原因是启动类注解@SpringBootApplication 是多个注解的集合,而其中一个注解@EnableAutoConfiguration注解 能够自动加载application.properties信息去配置(可参考文章:https://blog.csdn.net/zxc123e/article/details/80222967)

springboot 多模块项目的子模块如果不直接通过启动类运行而仅仅只是其他模块的一个依赖,那么这个子模块是不会自动加载自己的application.properties配置的。

子模块中 用@PropertySource(“classpath:application.properties”)注解 主动去加载application.properties 也不能成功加载配置子模块自己的application.properties。
如下:

@Configuration
@PropertySource("classpath:application.properties")
public class RedisConfig {
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

上述@PropertySource(“classpath:application.properties”) 不会加载子模块自己的application.properties

解决办法,将子模块 application.properties 改名后,@PropertySource就能够成功加载配置了!

将子模块的application.properties 改名为 redis.properties 后

@Configuration
@PropertySource("classpath:redis.properties")
public class RedisConfig {
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

子模块中配置 redis.properties 会在其他有启动类模块启动后自动加载。
参考来源:https://stackoverflow.com/questions/46784051/spring-boot-multi-module-project-load-property-file

你可能感兴趣的:(springboot)