您好,欢迎来到爱问旅游网。
搜索
您的当前位置:首页SpringBoot中AutoConfiguration的使用方法

SpringBoot中AutoConfiguration的使用方法

来源:爱问旅游网
SpringBoot中AutoConfiguration的使⽤⽅法

在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 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[{}]\ 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\ 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

然后配置参数

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; }

完整代码总结

以上所述是⼩编给⼤家介绍的SpringBoot 中 AutoConfiguration的使⽤⽅法,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- awee.cn 版权所有 湘ICP备2023022495号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务