本篇文章為大家展示了如何在SpringBoot 中使用AutoConfiguration,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
成都創(chuàng)新互聯(lián)專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、黟縣網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5建站、成都商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為黟縣等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
主要代碼片段:
String[] selectImports(AnnotationMetadata annotationMetadata)方法中
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
getAutoConfigurationEntry方法中:
Listconfigurations = 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
Enumerationurls = 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
我們來實現(xiàn)一個ZK的AutoConfiguration
首先定義一個ZookeeperAutoConfiguration類
然后在META-INF/spring.factories中加入
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.fayayo.fim.zookeeper.ZookeeperAutoConfiguration
接下來我們看看具體的實現(xiàn):
@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部分實現(xiàn):
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); } //監(jiān)聽 zkClient.subscribeChildChanges(parentPath, new IZkChildListener() { //對父節(jié)點添加監(jiān)聽子節(jié)點變化。 @Override public void handleChildChange(String parentPath, ListcurrentChilds) { 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.fayayo fim-registry-zookeeper 0.0.1-SNAPSHOT
然后配置參數(shù)
fim: register: address: 192.168.88.129:2181 timeout: 2000
如果不配置會有默認(rèn)的參數(shù)
具體使用的時候只需要在Bean中注入就可以了,比如
@Autowired private Registry registry; public ListgetAll(){ List list=cache.get(KEY); if(CollectionUtils.isEmpty(list)){ list=registry.discover(); cache.put(KEY,list); } return list; }
springboot一種全新的編程規(guī)范,其設(shè)計目的是用來簡化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個服務(wù)于框架的框架,服務(wù)范圍是簡化配置文件。
上述內(nèi)容就是如何在SpringBoot 中使用AutoConfiguration,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。