第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

SpringBoot 中 AutoConfiguration的使用

標(biāo)簽:
Java
在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<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);	

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> 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<URL> 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<String> 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呢
	首先要在需要使用的项目中引入依赖
	    <dependency>
            <groupId>com.fayayo</groupId>
            <artifactId>fim-registry-zookeeper</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

    然后配置参数
	fim:
      register:
        address: 192.168.88.129:2181
        timeout: 2000
    如果不配置会有默认的参数 

    具体使用的时候只需要在Bean中注入就可以了,比如
	@Autowired
    private Registry registry;

    public List<URL> getAll(){
        List<URL>list=cache.get(KEY);
        if(CollectionUtils.isEmpty(list)){
            list=registry.discover();
            cache.put(KEY,list);
        }
        return list;
    }

完整代码

https://github.com/lizu18xz/fim.git
點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消