Springboot项目在启动时,控制台输出日志:git
2019-05-28 15:28:32.439 INFO main [org.springframework.data.repository.config.RepositoryConfigurationDelegate:165]-Multiple Spring Data modules found, entering strict repository configuration mode! 2019-05-28 15:28:32.596 INFO main [org.springframework.data.repository.config.RepositoryConfigurationDelegate:165]-Multiple Spring Data modules found, entering strict repository configuration mode!
虽然说是INFO级别,可是凭白输出个带“!”的提醒信息仍是让人难免好奇,同时更多的会顾及这个提醒是否是架构的一些不稳定的因素。为此笔者决定一探究竟!github
private static final String MULTIPLE_MODULES = "Multiple Spring Data modules found, entering strict repository configuration mode!"; /** * 扫描jar,找出RepositoryFactorySupport接口的实现类,若是RepositoryFactorySupport接口实现类不止一个则打印提示信息“MULTIPLE_MODULES”。 * * Scans {@code repository.support} packages for implementations of {@link RepositoryFactorySupport}. Finding more * than a single type is considered a multi-store configuration scenario which will trigger stricter repository * scanning. * * @return */ private boolean multipleStoresDetected() { boolean multipleModulesFound = SpringFactoriesLoader .loadFactoryNames(RepositoryFactorySupport.class, resourceLoader.getClassLoader()).size() > 1; if (multipleModulesFound) { LOG.info(MULTIPLE_MODULES); } return multipleModulesFound; }
方法中SpringFactoriesLoader.loadFactoryNames(RepositoryFactorySupport.class, resourceLoader.getClassLoader()) 是spring.factories机制的重要实现,会查找全部jar包中META-INF/spring.factories文件配置信息。经过对loadFactoryNames方法断点调试,最终肯定了在spring-boot-starter-data-redis和spring-boot-starter-data-mongodb相关依赖包中都配置了RepositoryFactorySupport接口实现类。 spring-data-keyvalue.jarweb
org.springframework.data.repository.core.support.RepositoryFactorySupport=org.springframework.data.keyvalue.repository.support.KeyValueRepositoryFactory
spring-data-mongo.jarredis
org.springframework.data.web.config.SpringDataJacksonModules=org.springframework.data.mongodb.core.GeoJsonConfiguration org.springframework.data.repository.core.support.RepositoryFactorySupport=org.springframework.data.mongodb.repository.support.MongoRepositoryFactory
spring: data: mongodb: repositories: enabled: false redis: repositories: enabled: false
或者启动类中排除repository自动装载,以下:spring
@SpringBootApplication(exclude = { RedisRepositoriesAutoConfiguration.class, MongoRepositoriesAutoConfiguration.class })
此处列举的是redis和mongo,其余jpa、es等配置都是相似的。关闭了Repository功能后,控制就不会在打印出Multiple Spring Data modules found, entering strict repository configuration mode!的提示信息了。mongodb
若是项目中使用了Repository功能,那建议启动类中指定Repository具体包扫描路径,以下:架构
@EnableMongoRepositories(basePackages = "xxx.mongo.dao") @EnableRedisRepositories(basePackages = "xxx.redis.dao")
若是不指定具体Repository扫面包路径,那么不单单会出现本文标题那段提示信息,Repository覆盖提示信息,以下:
app
Spring Data Redis - Could not safely identify store assignment for repository candidate interface com.lucas.device.repository.mongo.DeviceInfoRepository.
消息级别仍然是INFO级别,意思是Redis定义的Repository会跳过DeviceInfoRepository等其余继承MongoRepository接口的实例化对象。当咱们定义的Repository接口越多,这种提示信息也就会越多。 ide
虽然只是INFO级别的信息,可是仍是要摸清楚产生的起因,一步步分析下来,咱们更加清楚架构设计不单单是使用,更应该以塑造的目光去精雕细琢,码农也能够成功手艺精湛的手艺人。spring-boot