在SpringBoot中我们经常可以引⼊⼀些starter包来集成⼀些⼯具的使⽤,⽐如spring-boot-starter-data-redis。使⽤起来很⽅便,那么是如何实现的呢?代码分析
我们先看注解@SpringBootApplication,它⾥⾯包含⼀个@EnableAutoConfiguration继续看@EnableAutoConfiguration注解
@Import({AutoConfigurationImportSelector.class})
在这个类(AutoConfigurationImportSelector)⾥⾯实现了⾃动配置的加载主要代码⽚段:
String[] selectImports(AnnotationMetadata annotationMetadata)⽅法中
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
getAutoConfigurationEntry⽅法中:
List protected List List 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 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[{}]\ 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 log.info(String.format(\"[ZookeeperRegistry] service list change: path=%s, currentChilds=%s\ if(watchNotify!=null){ watchNotify.notify(nodeChildsToUrls(currentChilds)); } } }); ShutDownHook.registerShutdownHook(this); } catch (Exception e) { e.printStackTrace(); log.error(\"Failed to subscribe zookeeper\"); } } 具体使⽤ 那么我们怎么使⽤⾃⼰写的ZookeeperAutoConfiguration呢 ⾸先要在需要使⽤的项⽬中引⼊依赖 然后配置参数 fim: register: address: 192.168.88.129:2181 timeout: 2000 如果不配置会有默认的参数 具体使⽤的时候只需要在Bean中注⼊就可以了,⽐如 @Autowired private Registry registry; public List List return list; } 完整代码总结 以上所述是⼩编给⼤家介绍的SpringBoot 中 AutoConfiguration的使⽤⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持! 如果你觉得本⽂对你有帮助,欢迎转载,烦请注明出处,谢谢! 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务