spring cloud config配置中心源码分析之注解@EnableConfigServer
spring cloud config的主函數是ConfigServerApplication,其定義如下:
@Configuration @EnableAutoConfiguration @EnableConfigServer public class ConfigServerApplication {public static void main(String[] args) {new SpringApplicationBuilder(ConfigServerApplication.class).properties("spring.config.name=configserver").run(args);}}其中
@Configuration是spring定義的注解,使用注解,配置信息的載體由 XML 文件轉移到了 Java 類中。
@EnableAutoConfiguration是spring boot定義的注解,控制spring applicationContext的自動配置的開關。
@EnableConfigServer是spring cloud定義的注解,
@EnableConfigServer定義如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import({ ResourceRepositoryConfiguration.class, EnvironmentRepositoryConfiguration.class, ConfigServerEncryptionConfiguration.class, ConfigServerMvcConfiguration.class }) public @interface EnableConfigServer {}1.?ResourceRepositoryConfiguration
定義如下:
@Configuration @EnableConfigurationProperties(ConfigServerProperties.class) @ConditionalOnMissingBean(ResourceRepository.class) public class ResourceRepositoryConfiguration {@Bean@ConditionalOnBean(SearchPathLocator.class)public ResourceRepository resourceRepository(SearchPathLocator service) {return new GenericResourceRepository(service);} }?返回ResourceRepository,其實現類為:GenericResourceRepository,內部服務為SearchPathLocator。實現方法為:
@Overridepublic synchronized Resource findOne(String application, String profile, String label,String path) {String[] locations = this.service.getLocations(application, profile, label).getLocations();try {for (int i = locations.length; i-- > 0;) {String location = locations[i];for (String local : getProfilePaths(profile, path)) {Resource file = this.resourceLoader.getResource(location).createRelative(local);if (file.exists() && file.isReadable()) {return file;}}}}catch (IOException e) {throw new NoSuchResourceException("Error : " + path + ". (" + e.getMessage() + ")");}throw new NoSuchResourceException("Not found: " + path);}SearchPathLocator定義了搜索資源路徑的策略,其層次結構如下:
2.EnvironmentRepositoryConfiguration
內部定了四種環境的配置
2.1.?NativeEnvironmentRepository
@Configuration@Profile("native")protected static class NativeRepositoryConfiguration {@Autowiredprivate ConfigurableEnvironment environment;@Beanpublic NativeEnvironmentRepository environmentRepository() {return new NativeEnvironmentRepository(this.environment);}}2.2.?MultipleJGitEnvironmentRepository
@Configuration@ConditionalOnMissingBean(EnvironmentRepository.class)protected static class GitRepositoryConfiguration {@Autowiredprivate ConfigurableEnvironment environment;@Autowiredprivate ConfigServerProperties server;@Beanpublic MultipleJGitEnvironmentRepository environmentRepository() {MultipleJGitEnvironmentRepository repository = new MultipleJGitEnvironmentRepository(this.environment);if (this.server.getDefaultLabel()!=null) {repository.setDefaultLabel(this.server.getDefaultLabel());}return repository;}}2.3.SvnKitEnvironmentRepository
@Configuration@Profile("subversion")protected static class SvnRepositoryConfiguration {@Autowiredprivate ConfigurableEnvironment environment;@Autowiredprivate ConfigServerProperties server;@Beanpublic SvnKitEnvironmentRepository environmentRepository() {SvnKitEnvironmentRepository repository = new SvnKitEnvironmentRepository(this.environment);if (this.server.getDefaultLabel()!=null) {repository.setDefaultLabel(this.server.getDefaultLabel());}return repository;}}2.4.VaultEnvironmentRepository
@Configuration@Profile("vault")protected static class VaultConfiguration {@Beanpublic EnvironmentRepository environmentRepository(HttpServletRequest request, EnvironmentWatch watch) {return new VaultEnvironmentRepository(request, watch, new RestTemplate());}}另外還有,ConfigServerHealthIndicator、ConsulEnvironmentWatch、EnvironmentWatch
3.ConfigServerEncryptionConfiguration
定義了EncryptionController
@Beanpublic EncryptionController encryptionController() {EncryptionController controller = new EncryptionController(this.encryptor);controller.setDefaultApplicationName(this.properties.getDefaultApplicationName());controller.setDefaultProfile(this.properties.getDefaultProfile());return controller;}4.ConfigServerMvcConfiguration
定義了EnvironmentController和ResourceController
@Beanpublic EnvironmentController environmentController() {EnvironmentController controller = new EnvironmentController(encrypted(), this.objectMapper);controller.setStripDocumentFromYaml(this.server.isStripDocumentFromYaml());return controller;}@Bean@ConditionalOnBean(ResourceRepository.class)public ResourceController resourceController(ResourceRepository repository) {ResourceController controller = new ResourceController(repository,encrypted());return controller;}支持的協議有三種:
@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {configurer.mediaType("properties", MediaType.valueOf("text/plain"));configurer.mediaType("yml", MediaType.valueOf("text/yaml"));configurer.mediaType("yaml", MediaType.valueOf("text/yaml"));}?
轉載于:https://www.cnblogs.com/davidwang456/p/5979563.html
總結
以上是生活随笔為你收集整理的spring cloud config配置中心源码分析之注解@EnableConfigServer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 量化派基于Hadoop、Spark、St
- 下一篇: Reddit如何使用Memcached来