• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SpringBoot 中 AutoConfiguration的使用方法

springboot 搞代码 4年前 (2022-01-05) 38次浏览 已收录 0个评论

这篇文章主要介绍了SpringBoot 中 AutoConfiguration的使用方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

在SpringBoot中我们经常可以引入一些starter包来集成一些工具的使用,比如spring-boot-starter-d来源gaodaima#com搞(代@码网ata-redis

使用起来很方便,那么是如何实现的呢?

代码分析

我们先看注解@SpringBootApplication,它里面包含一个@EnableAutoConfiguration

继续看@EnableAutoConfiguration注解

@Import({AutoConfigurationImportSelector.class})

在这个类(AutoConfigurationImportSelector)里面实现了自动配置的加载

主要代码片段:

String[] selectImports(AnnotationMetadata annotationMetadata)方法中

 AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);

getAutoConfigurationEntry方法中: 

 List configurations = this.getCandidateConfigurations(annotationMetadata, attributes); protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }

最后会通过SpringFactoriesLoader.loadSpringFactories去加载META-INF/spring.factories

 Enumeration urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories"); LinkedMultiValueMap result = new LinkedMultiValueMap();
 while(urls.hasMoreElements()) { URL url = (URL)urls.nextElement(); UrlResource resource = new UrlResource(url); Properties properties = PropertiesLoaderUtils.loadProperties(resource); Iterator var6 = properties.entrySet().iterator(); while(var6.hasNext()) { Entry entry = (Entry)var6.next(); String factoryClassName = ((String)entry.getKey()).trim(); String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue()); int var10 = var9.length; for(int var11 = 0; var11 <var10; ++var11) { String factoryName = var9[var11]; result.add(factoryClassName, factoryName.trim()); } } }

ZookeeperAutoConfiguration

我们来实现一个ZK的AutoConfiguration    

首先定义一个ZookeeperAutoConfiguration类 

然后在META-INF/spring.factories中加入

 org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.fayayo.fim.zookeeper.ZookeeperAutoConfiguration

接下来我们看看具体的实现:

 @ConfigurationProperties(prefix = "fim.register") @Configuration public class URLRegistry { private String address; private int timeout; private int sessionTimeout; public String getAddress() { if (address == null) { address = URLParam.ADDRESS; } return address; } public void setAddress(String address) { this.address = address; } public int getTimeout() { if (timeout == 0) { timeout = URLParam.CONNECTTIMEOUT; } return timeout; } public void setTimeout(int timeout) { this.timeout = timeout; } public int getSessionTimeout() { if (sessionTimeout == 0) { sessionTimeout = URLParam.REGISTRYSESSIONTIMEOUT; } return sessionTimeout; } public void setSessionTimeout(int sessionTimeout) { this.sessionTimeout = sessionTimeout; } } @Configuration @EnableConfigurationProperties(URLRegistry.class) @Slf4j public class ZookeeperAutoConfiguration { @Autowired private URLRegistry url; @Bean(value = "registry") public Registry createRegistry() { try { String address = url.getAddress(); int timeout = url.getTimeout(); int sessionTimeout = url.getSessionTimeout(); log.info("init ZookeeperRegistry,address[{}],sessionTimeout[{}],timeout[{}]", address, timeout, sessionTimeout); ZkClient zkClient = new ZkClient(address, sessionTimeout, timeout); return new ZookeeperRegistry(zkClient); } catch (ZkException e) { log.error("[ZookeeperRegistry] fail to connect zookeeper, cause: " + e.getMessage()); throw e; } } }

 ZookeeperRegistry部分实现:

 public ZookeeperRegistry(ZkClient zkClient) { this.zkClient = zkClient; log.info("zk register success!"); String parentPath = URLParam.ZOOKEEPER_REGISTRY_NAMESPACE; try { if (!zkClient.exists(parentPath)) { log.info("init zookeeper registry namespace"); zkClient.createPersistent(parentPath, true); } //监听 zkClient.subscribeChildChanges(parentPath, new IZkChildListener() { //对父节点添加监听子节点变化。 @Override public void handleChildChange(String parentPath, List currentChilds) { log.info(String.format("[ZookeeperRegistry] service list change: path=%s, currentChilds=%s", parentPath, currentChilds.toString())); if(watchNotify!=null){ watchNotify.notify(nodeChildsToUrls(currentChilds)); } } }); ShutDownHook.registerShutdownHook(this); } catch (Exception e) { e.printStackTrace(); log.error("Failed to subscribe zookeeper"); } }

具体使用

那么我们怎么使用自己写的ZookeeperAutoConfiguration呢

 首先要在需要使用的项目中引入依赖

  com.fayayofim-registry-zookeeper0.0.1-SNAPSHOT

    然后配置参数

 fim: register: address: 192.168.88.129:2181 timeout: 2000

   如果不配置会有默认的参数

    具体使用的时候只需要在Bean中注入就可以了,比如

 @Autowired private Registry registry; public List getAll(){ Listlist=cache.get(KEY); if(CollectionUtils.isEmpty(list)){ list=registry.discover(); cache.put(KEY,list); } return list; }

完整代码

https://github.com/lizu18xz/fim.git

总结

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

以上就是SpringBoot 中 AutoConfiguration的使用方法的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SpringBoot 中 AutoConfiguration的使用方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址