博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot加载配置文件
阅读量:6334 次
发布时间:2019-06-22

本文共 4910 字,大约阅读时间需要 16 分钟。

hot3.png

想要了解springboot加载配置文件,要了解观察者模式,以及相应的实现方式

1、观察者模式(Publish/Subscribe):

   举例说明:

           报社方负责出版报纸.

    你订阅了该报社的报纸,那么只要报社发布了新报纸,就会通知你,或发到你手上.

    如果你不想再读报纸,可以取消订阅,这样,报社发布了新报纸就不会再通知你.

            

          jdk不仅提供了Observable类、Observer接口支持观察者模式,而且也提供了EventObject类、EventListener接口来支持事件监听模式,

            虽然两者属于同一类型模式,都属于回调机制,主动推送消息,但使用场景有些区别。

        1. 事件-监听机制

                8129c489-e633-332b-934b-f1d02da88cd1.png

 

 

    2. 观察者模式 

       观察者(Observer)相当于事件监听者(监听器),被观察者(Observable)相当于事件源和事件,执行逻辑时通知observer即可触发oberver的update,

       同时    可传被观察者和参数。简化了事件-监听模式的实现

            6969feea-7885-3dbf-863d-0608da10b4b4.png

 

连接为设计模式 

package com.ctrip.framework.apollo.configservice;import com.ctrip.framework.apollo.biz.ApolloBizConfig;import com.ctrip.framework.apollo.common.ApolloCommonConfig;import com.ctrip.framework.apollo.metaservice.ApolloMetaServiceConfig;import java.lang.reflect.Constructor;import java.net.URL;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Enumeration;import java.util.LinkedHashSet;import java.util.List;import java.util.Map;import java.util.Properties;import java.util.Set;import org.springframework.beans.BeanUtils;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;import org.springframework.context.ApplicationContextInitializer;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.UrlResource;import org.springframework.core.io.support.PropertiesLoaderUtils;import org.springframework.core.io.support.SpringFactoriesLoader;import org.springframework.transaction.annotation.EnableTransactionManagement;import org.springframework.util.Assert;import org.springframework.util.ClassUtils;import org.springframework.util.ConcurrentReferenceHashMap;import org.springframework.util.LinkedMultiValueMap;import org.springframework.util.MultiValueMap;import org.springframework.util.StringUtils;/** * Spring boot application entry point * * @author Jason Song(song_s@ctrip.com) */@EnableEurekaServer@EnableAspectJAutoProxy@EnableAutoConfiguration // (exclude = EurekaClientConfigBean.class)@Configuration@EnableTransactionManagement@PropertySource(value = {"classpath:configservice.properties"})@ComponentScan(basePackageClasses = {ApolloCommonConfig.class,    ApolloBizConfig.class,    ConfigServiceApplication.class,    ApolloMetaServiceConfig.class})public class ConfigServiceApplication {	private static final Map
> cache = new ConcurrentReferenceHashMap<>(); public static void main(String[] args) throws Exception { ClassLoader classloader = ConfigServiceApplication.class.getClassLoader(); Enumeration
urls = classloader.getResources("META-INF/spring.factories") ; MultiValueMap
result = new LinkedMultiValueMap<>(); while (urls.hasMoreElements()) { URL url = urls.nextElement(); UrlResource resource = new UrlResource(url); Properties properties = PropertiesLoaderUtils.loadProperties(resource); for (Map.Entry
entry : properties.entrySet()) { List
factoryClassNames = Arrays.asList(StringUtils.commaDelimitedListToStringArray((String) entry.getValue())); result.addAll((String) entry.getKey(), factoryClassNames); } } cache.put(classloader, result); String factoryClassName = ApplicationContextInitializer.class.getName(); result.getOrDefault(factoryClassName, Collections.emptyList()); Set
names = new LinkedHashSet<>(result.getOrDefault(factoryClassName, Collections.emptyList())); System.out.println(names); for (String name : names) { Class
instanceClass = ClassUtils.forName(name, classloader); Assert.isAssignable(ApplicationContextInitializer.class, instanceClass); Constructor
constructor = instanceClass.getDeclaredConstructor(parameterTypes); BeanUtils.instantiateClass(constructor, args); Object instance = (Object) BeanUtils.instantiateClass(constructor, args); } SpringApplication.run(ConfigServiceApplication.class, args); } @SuppressWarnings("unchecked") private
List
createSpringFactoriesInstances(Class
type, Class
[] parameterTypes, ClassLoader classLoader, Object[] args, Set
names) { List
instances = new ArrayList<>(names.size()); for (String name : names) { try { Class
instanceClass = ClassUtils.forName(name, classLoader); Assert.isAssignable(type, instanceClass); Constructor
constructor = instanceClass.getDeclaredConstructor(parameterTypes); T instance = (T) BeanUtils.instantiateClass(constructor, args); instances.add(instance); } catch (Throwable ex) { throw new IllegalArgumentException( "Cannot instantiate " + type + " : " + name, ex); }; } return instances; }}

 

转载于:https://my.oschina.net/u/198077/blog/3025999

你可能感兴趣的文章
EOS主网上线只是开始,如何运营决定未来
查看>>
不用Visual Studio,5分钟轻松实现一张报表
查看>>
(译)如何使用cocos2d和box2d来制作一个Breakout游戏:第一部分
查看>>
计算机图形学(一) 图形系统综述
查看>>
持续集成(CI)- 几种测试的区别(摘录)
查看>>
多用户虚拟Web3D环境Deep MatrixIP9 1.04发布
查看>>
求高手,求解释
查看>>
[MSSQL]NTILE另类分页有么有?!
查看>>
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>
Jquery闪烁提示特效
查看>>
最佳6款用于移动网站开发的 jQuery 图片滑块插件
查看>>
C++ String
查看>>
获取系统托盘图标的坐标及文本
查看>>
log4j Test
查看>>
HDU 1255 覆盖的面积(矩形面积交)
查看>>
Combinations
查看>>
SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。...
查看>>
第二十一章流 3用cin输入
查看>>
在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
查看>>
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>