`
确实比较男
  • 浏览: 114330 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Guzz源码分析(四) guzz加载config-server信息

    博客分类:
  • Guzz
阅读更多

1. 感觉有点懒惰了,两天没有写了,今天继续分析guzz加载config-server信息,说直接点就是解析guzz.xml中config-server配置的properties

 

<config-server>
	<server class="org.guzz.config.LocalFileConfigServer">
		<param name="resource" value="guzz_app.properties" />
	</server>
</config-server>

主要就是加载guzz_app.properties

2. 还是在GuzzContextImpl的initFromMainConfig方法中找到下面的代码:

 

configServer = builder.loadConfigServer() ;
if(configServer == null){
	throw new GuzzException("config-server is not available.") ;
}

就是这里解析了config-server,进入到loadConfigServer,这里也是解析xml,和前面的差不多,找到下面的代码

 

ConfigServer server = (ConfigServer) BeanCreator.newBeanInstance(className) ;
JavaBeanWrapper bw = BeanWrapper.createPOJOWrapper(server.getClass()) ;		

2.1 首先看第一句代码,这里是根据xml配置的class通过BeanCreator创建一个对象,类结构图:

在Guzz中只提供了这么一个实现类,但是也可以自己实现的,这里主要列出了2个重要的方法,都等下来看具体的实现。

2.2 接着看第二句代码,这里有出现了BeanWrapper,主要的作用是用于对POJO对象进行读写。BeanWrapper在初始化后会缓存bean的方法信息。就拿上面的2句代码来说明,我们通常配置文件创建了一个ConfigServer,但是在具体运行的时刻而是实现类LocalFileConfigServer,而这个BeanWrapper就是可以获取到运行时刻的ConfigServer的方法,这样不管是LocalFileConfigServer还是自己实现的ConfigServer,都可以通过BeanWrapper知道运行时具体是哪个类,有哪些方法。BeanWrapper类结构图:


由于这里只用到了JavaBeanWrapper,我们就只看这个类,首先看下构造方法:

 

public JavaBeanWrapper(Class beanClass){
		this.beanClass = beanClass ;
		BeanInfo bi;
		try {
			bi = Introspector.getBeanInfo(beanClass);
		} catch (IntrospectionException e) {
			throw new ORMException("fail to contruct beanwrapper:" + beanClass, e) ;
		}
		PropertyDescriptor[] pd = bi.getPropertyDescriptors();
		//FIXME: cann't handle property:My_book_title
		for(int i = 0 ; i < pd.length ; i++){
			this.propertyDescriptors.put(pd[i].getName(), pd[i]) ;
		}	
	}

只看红色的代码,首先获取到BeanInfo对象,然后获取到所有属性的PropertyDescriptor对象数组,循环吧数组中的每一个对象存放到map对象中,具体PropertyDescriptor有什么东西,自己可以把写一个测试类打印下就知道了,主要是保存的是每一个属性,和这个属性的读写方法。只要看了构造方法其他的方法都可以不用看了,肯定是通过保存在map中的PropertyDescriptor对象进行的操作。

3. 接着回到GuzzConfigFileBuilder的loadConfigServer方法中,

 

List xml_params = e.selectNodes("param") ;
for(int i = 0 ; i < xml_params.size() ; i++){
	Element xml_param = (Element) xml_params.get(i) ;
	String propName = xml_param.attributeValue("name") ;
	String value = xml_param.attributeValue("value") ;
	if(Resource.class.isAssignableFrom(bw.getPropertyType(propName))){				
		FileResource fr = new FileResource(mainConfigResource, value) ;
		try{
			bw.setValue(server, propName, fr) ;
		}finally{
			CloseUtil.close(fr) ;
		}
	}else{
		bw.setValue(server, propName, value) ;
	}
}

这段代码就是解析param,文章开头已经写了我的配置,那么这里的propName的值就是resource,value就是guzz_app.properties,看红色的代码,调用JavaBeanWrapper的setValue方法,看这里要明确运行的时候各个变量具体代表什么,bw就是JavaBeanWrapper对象,存的都是ConfigServer的属性读写方法,而这里的ConfigServer具体有时指LocalFileConfigServer;参数server具体也是LocalFileConfigServer。接着进入到setValue(...)

 

public void setValue(Object beanInstance, String propName, Object value){
	PropertyDescriptor pd = (PropertyDescriptor) this.propertyDescriptors.get(propName) ;
	...
	Method writeMethod = pd.getWriteMethod();
	if (writeMethod != null) {
		try {
			writeMethod.invoke(beanInstance, new Object[]{value});
		} catch (IllegalArgumentException e) {
		...
		}
	}else{
		throw new ORMException("property:" + propName + " not writable in :" + this.beanClass) ;
	}
}

首先通过属性名称获取到PropertyDescriptor,然后得到写的方法,接着调用方法,我们的属性名称是resource,那么写方法就是setResource,而对象又是LocalFileConfigServer,所以我们就去看LocalFileConfigServer的setResource方法。

4.LocalFileConfigServer的setResource方法有调用了addResource,这也是要的实现方法:

protected void addResource(Resource r, boolean resourceMustBeValid){
	Map props = PropertyUtil.loadGroupedProps(r) ;
	....
	Iterator keys = props.entrySet().iterator() ;
	while(keys.hasNext()){
		Map.Entry entry = (Entry) keys.next() ;
		String configGroupName = (String) entry.getKey() ;
		Properties[] ps = (Properties[]) entry.getValue() ;
		ServiceConfig[] scs = new ServiceConfig[ps.length] ;
		for(int i = 0 ; i < ps.length ; i++){
			Properties p = ps[i] ;
			ServiceConfig sc = new ServiceConfig() ;
			scs[i] = sc ;
			sc.setConfigName(configGroupName) ;
			//读取系统配置项uniqueIdentifer appName serviceName IP maxLoad
			//剩下作为附件参数
			sc.setUniqueIdentifer(p.getProperty("guzz.identifer")) ;
			sc.setIP(p.getProperty("guzz.IP")) ;
			sc.setMaxLoad(StringUtil.toInt(p.getProperty("guzz.maxLoad"), -1)) ;
			sc.setAppName(p.getProperty("guzz.appName")) ;
			.....
		}
		configs.put(configGroupName, scs) ;
	}
}

第一段红色加粗的地方就是guzz在解析配置文件guzz_app.properties,把以中括号([...])开始的分为一个组,统一存放到一个Map,key就是中括号中的值,作为服务名,具体代码可以自己去看。剩下的一大段循环就是取出返回来的Map中的每一个对象(具体就是Properties),然后根据Properties对象创建服务配置对象ServiceConfig,接着把ServiceConfig对象保存到全局Map对象中。
5.guzz加载config-server信息的过程分析完成。


分享到:
评论

相关推荐

    guzz的jar包

    guzz的jar包,工程下直接考过来的,可以直接使用

    guzz: a empty sample project build20110323.zip

    通过分析和运行这个项目,我们可以深入理解Guzz的核心概念和使用方法。 首先,Guzz的设计目标是提供一种灵活、高效的解决方案,用于处理实时或批处理的数据流任务。它采用了面向任务编程模型,使得开发者可以专注于...

    guzz开发jar

    guzz是一套用来进行快速开发和高性能网站设计的java框架,通过ORM、多数据源数据管理、以及通用数据处理,为系统在数据层的设计提供一站式解决方案。用于替代或者补充hibernate或ibatis,并提供更多的大型系统架构...

    Guzz-crx插件

    此外,对于敏感信息的处理,Guzz-crx可能会有相应的屏蔽或遮罩功能,防止无意间泄露个人信息。 技术上,Guzz-crx插件通常由HTML、CSS和JavaScript编写,这些代码打包成CRX格式的文件,即我们看到的“Guzz.crx”。...

    guzz的「Guzz」-crx插件

    为Guzz启用屏幕共享。 此扩展程序允许www.guzz.io用户共享桌面屏幕 支持语言:English

    Laravel中使用阿里云OSS Composer包分享

    阿里云提供了基于命名空间的 V2 版 SDK,但是文档不是很完整,使用门槛比较高,于是我封装了一个 Composer 包:https://github.com/johnlui/AliyunOSS 安装 将以下内容增加到 composer.json: 复制代码 代码如下: ...

    bicq代码

    为了深入了解,你可以访问提供的博文链接(https://guzz.iteye.com/blog/507276),在那里可能会找到关于BICQ的详细解释、使用示例和开发背景等信息。同时,查看压缩包中的文件(BICQ)可以获取实际的源代码,进一步...

    哀悼日变灰操作

    根据给定文件的信息,我们可以提炼出与“哀悼日变灰操作”相关的IT知识点,但首先需要澄清的是,文件内容似乎包含了一些不相关的代码片段和文档,这些内容涉及一个名为"Guzz"的全栈数据层解决方案框架,以及一系列与...

    InstallAnywhere 2008破解与自定义PlugIn陷阱经验分享

    NULL 博文链接:https://guzz.iteye.com/blog/256235

    Java面试题全集.docx

    #### 四、Hibernate Session中的方法及其区别 **知识点概述:** Hibernate中的Session提供了多种用于数据操作的方法,每种方法都有其特定的用途和应用场景。 **详细解释:** - **load与get**: - **load**:如果...

    java框架面试题

    #### 四、Hibernate中Session的load和get方法 **1. load与get的区别** - **load**方法假设指定ID的实体一定存在于数据库中,返回的是代理对象。如果没有找到对应的实体,则抛出异常。 - **get**方法直接返回实体...

    轻松将一张大表分切到不同的机器中

    NULL 博文链接:https://guzz.iteye.com/blog/883225

    php-sdk:用于连接到MultiSafepay REST API的默认PHP库

    MultiSafepay PHP SDK关于...如果您没有安装任何客户端实现,请使用以下命令: composer require guzzlehttp/guzzle如果您没有安装任何工厂实现,请使用以下命令: composer require http-interop/http-factory-guzz

    bof:人类的HTTP客户端

    为什么?... 它使最经典的用例(例如下载文件,与JSON API交互或提交表单)尽可能地简单。 由于基于 ,因此可以直接使用Guzzle的方法解决更高级的用例。 总结起来,Bof: 是用户友好的避免使用魔术字符串... 这是Bof与Guzz

    JAVA面试问题及答案.docx

    常见的持久层框架有Hibernate、MyBatis、TopLink、Guzz、jOOQ、Spring Data和ActiveJDBC等,它们都为开发者提供了便捷的数据持久化解决方案。 在Hibernate中,Session提供了多种操作数据库的方法,如load()和get()...

    java框架方面面试题

    目前市面上有多个持久层框架,如Hibernate、MyBatis、TopLink、Guzz、jOOQ、Spring Data和ActiveJDBC等,它们各有特点,为开发者提供不同场景下的解决方案。 在Hibernate框架中,SessionFactory是一个重要的概念,...

    Java面试题全集(下)

    持久层框架则是实现数据持久化操作的一系列框架,常见的有Hibernate、MyBatis、TopLink、Guzz-jOOQ、SpringData和ActiveJDBC等。 3. Hibernate持久层框架:Hibernate是一个开源的ORM框架,它提供了一个完整的解决...

    JAVA面试问题及标准答案.docx

    常见的Java持久层框架有Hibernate、MyBatis、TopLink、Guzz、jOOQ、Spring Data和ActiveJDBC等,它们都提供了方便的数据操作和数据库访问功能。 在Hibernate中,SessionFactory是一个关键组件,它是线程安全的,...

Global site tag (gtag.js) - Google Analytics