热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

模拟Spring注入和读取配置文件信息(支持bean书写顺序随意)

参考:http:blog.csdn.netxiangsuixinshengarticledetails6539324增加点:1.bean的书写顺序随意,不要求r

参考:http://blog.csdn.net/xiangsuixinsheng/article/details/6539324

增加点:

1.bean的书写顺序随意,不要求ref的bean一定已经注册;

2.使用dom4j实现

一、JAVA实现脚本

package com.bjsxt.spring.utils;

import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.bjsxt.spring.demo.Demo1;
import com.bjsxt.spring.demo.Demo2;

public class ClassPathXmlApplicationContext {
	private Map beans  = new HashMap(); //bean容器
	
	private List elements;	//解析xml生成的中间数据
	
	public ClassPathXmlApplicationContext(String resource) throws Exception{
		//初始化容器
		init(resource);
	}
	
	/**
	 * 加载XML文件
	 * @param resource
	 * @throws Exception
	 */
	@SuppressWarnings({ "unchecked", "unused" })
	private void init(String resource)throws Exception{
		SAXReader reader = new SAXReader();
		InputStream in = this.getClass().getResourceAsStream(resource);
		
		elements = reader.read(in).getRootElement().elements("bean");
		for (Element e : elements) {
			parseElement(e);
		}
		
	}
	
	/**
	 * 解析XML节点生成出Bean放到容器中
	 * @param element
	 * @throws Exception
	 */
	private void parseElement(Element element)throws Exception{
		// 获取对应id,class,propertity
		String id = element.attributeValue("id");
		String clazz = element.attributeValue("class");
		
		Object o = Class.forName(clazz).newInstance();
		beans.put(id, o);	//将类注入容器
		
		@SuppressWarnings("unchecked")
		List child = element.elements();
		
		for (Element e : child) {
			String name = e.attributeValue("name");
			String value = e.attributeValue("value");
			String ref = e.attributeValue("ref");
			Object beanObject = null;
			if(null!=ref && !("".equals(ref))){
				// 判断beans中是否存在
				beanObject = beans.get(ref);
				if(null == beanObject){//若在容器中不存在,暂时不处理
					for (Element e1 : elements) {
						String id1 = e1.attributeValue("id");
						if(id1.equals(ref)){
							parseElement(e1);	//递归调用注册类到容器
							break;
						}
					}
				}
				beanObject = beans.get(ref);
			}
			
			String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1); //拼装生成setter方法
			
			if(null==value || "".equals(value)){
				//若为结构
				Method m = o.getClass().getMethod(methodName, beanObject.getClass());
				m.invoke(o, beanObject);
			}else{
				//若为结构
				Method m = o.getClass().getMethod(methodName, value.getClass());
				m.invoke(o, value);
			}
			
		}
		
		
	}
	
	/**
	 * 获取Bean
	 * @param id
	 * @return
	 */
	public Object getBean(String id){
		return beans.get(id);
	}
	
	public static void main(String[] args) throws Exception{
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
		
		Demo1 d1 = (Demo1)ctx.getBean("demo01");
		Demo2 d2 = (Demo2)ctx.getBean("demo02");
		
		System.out.println(d1);
		System.out.println(d2);
		
	}


二、XML配置脚本例子:



	
		
	
	
		
		



推荐阅读
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • position属性absolute与relative的区别和用法详解
    本文详细解读了CSS中的position属性absolute和relative的区别和用法。通过解释绝对定位和相对定位的含义,以及配合TOP、RIGHT、BOTTOM、LEFT进行定位的方式,说明了它们的特性和能够实现的效果。同时指出了在网页居中时使用Absolute可能会出错的原因,即以浏览器左上角为原始点进行定位,不会随着分辨率的变化而变化位置。最后总结了一些使用这两个属性的技巧。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • 本文介绍了2015年九月八日的js学习总结及相关知识点,包括参考书《javaScript Dom编程的艺术》、js简史、Dom、DHTML、解释型程序设计和编译型程序设计等内容。同时还提到了最佳实践是将标签放到HTML文档的最后,并且对语句和注释的使用进行了说明。 ... [详细]
  • 本文讨论了如何使用GStreamer来删除H264格式视频文件中的中间部分,而不需要进行重编码。作者提出了使用gst_element_seek(...)函数来实现这个目标的思路,并提到遇到了一个解决不了的BUG。文章还列举了8个解决方案,希望能够得到更好的思路。 ... [详细]
  • Jquery 跨域问题
    为什么80%的码农都做不了架构师?JQuery1.2后getJSON方法支持跨域读取json数据,原理是利用一个叫做jsonp的概念。当然 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
author-avatar
郭原雪2865
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有