`
xielioo
  • 浏览: 7887 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

自己实现的一个XML对象容器

    博客分类:
  • JAVA
阅读更多
IApplicationContent为容器,通过其中的方法可以添加配置文件,根据ID获得注入对象。注入对象xml规范见template.dtd。添加的配置文件交由IXMLParse负责解析。IXMLParse将文件解析的信息存放入配件IBean中,IBean中存放着关于对象类型,生产函数及其参数(不设定name属性或属性值为空时为构造函数),还有一些预定义的属性及值,参数和属性均支持引用注入的其他对象。属性及参数对应IProperty。
template.dtd

<?xml version="1.0" encoding="UTF-8"?>

<!ELEMENT ApplicationContent (bean*)>
<!ELEMENT bean (property*,construct?)>
<!ELEMENT property (#PCDATA)>
<!ELEMENT construct (param*)>
<!ELEMENT param (#PCDATA)>

<!ATTLIST bean id ID #REQUIRED>
<!ATTLIST bean class CDATA #REQUIRED>

<!ATTLIST property name CDATA #REQUIRED>
<!ATTLIST property type CDATA #REQUIRED>
<!ATTLIST property ref CDATA #IMPLIED>

<!ATTLIST construct name CDATA #IMPLIED>

<!ATTLIST param name CDATA #REQUIRED>
<!ATTLIST param type CDATA #REQUIRED>
<!ATTLIST param ref CDATA #IMPLIED>


IApplicationContent
/**
	 * 配置文件名,可以连续添加多个配置文件并解析为基本配件IBean的列表
	 * @return
	 */
	public IApplicationContent AddConfigFile(String fileName);
	/**
	 * 根据ID获得实例的引用,如果实例已生成过则直接返回,否则用反射生产
	 * @param id
	 * @return
	 */
	public Object getObjectByID(String id);


实现ApplicationContent
public IApplicationContent AddConfigFile(String fileName) {
		if (!fileList.contains(fileName)) {
			fileList.add(fileName);
			parse.setFileName(fileName);
			List list = parse.parse();
			if (list != null) {
				for (Object obj : list) {
					try {
						if (objs.containsKey(((IBean) obj).getID())) {
							throw (new BeanException())
									.setMessage("配置文件中的Bean的ID不能重复");
						}
					} catch (BeanException e) {
						e.printStackTrace();
					}
					objs.put(((IBean) obj).getID(), obj);
				}
			}
		}
		return this;
	}

	public Object getObjectByID(String id) {
		IBean bean = (IBean) objs.get(id);
		Object obj = bean.getInstance();
		if (obj != null) {
			return obj;
		}
		try {
			Class cls = Class.forName(bean.getClassName());
			Class[] ps = new Class[bean.getParams().size()];
			Object[] ops = new Object[bean.getParams().size()];
			Object pobj = null;
			Object method = null;
			IProperty prop = null;
			String mstr = bean.getConstruct();
			int i = 0;
			int count = bean.getParams().size();
			for (; i < count; i++) {
				ps[i] = Class.forName(((IProperty) bean.getParams().get(i))
						.getType());
			}
			for (i = 0; i < count; i++) {
				prop = (IProperty) bean.getParams().get(i);
				if (prop.isRef()) {
					ops[i] = this.getObjectByID((String)prop.getValue());
				} else {
					ops[i] = prop.getValue();
				}
			}

			try {
				if (mstr != null
						&& mstr != ""
						&& !mstr.equals(bean.getClassName().substring(
								bean.getClassName().lastIndexOf(".")))) {
					method = cls.getDeclaredMethod(mstr, ps);
					obj = cls.newInstance();
					((Method) method).invoke(obj, ops);
				} else {
					method = cls.getDeclaredConstructor(ps);
					obj = ((Constructor) method).newInstance(ops);
				}
				if (obj != null) {
					count = bean.getProperties().size();
					for (i = 0; i < count; i++) {
						prop = ((IProperty) bean.getProperties().get(i));
						mstr = (String) prop.getName();
						mstr = "set" + mstr.substring(0, 1).toUpperCase()
								+ mstr.substring(1);
						method = cls.getDeclaredMethod(mstr,
								new Class[] { Class.forName(prop.getType()) });
						pobj = prop.getValue();
						if (prop.isRef()) {
							pobj = this.getObjectByID((String) pobj);
						}
						((Method) method).invoke(obj, new Object[] { pobj });
					}
				}

				bean.setObj(obj);
				return bean.getInstance();

			} catch (SecurityException e) {
				System.out.println(e.getMessage());
				e.printStackTrace();
			} catch (NoSuchMethodException e) {
				System.out.println("类 " + bean.getClassName() + " 不存在方法 "
						+ mstr + ":" + e.getMessage());
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				System.out.println(e.getMessage());
				e.printStackTrace();
			} catch (InstantiationException e) {
				System.out.println(e.getMessage());
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				System.out.println(e.getMessage());
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				System.out.println(e.getMessage());
				e.printStackTrace();
			}
		} catch (ClassNotFoundException e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}

		bean.setObj(null);
		return null;
	}


IXMLParse
public String getFileName();
	public IXMLParse setFileName(String fileName);
	/**
	 * 从配置文件解析实例信息并返回
	 * @param fileName
	 * @return
	 */
	public List parse();

实现BeanParse
public List parse() {
		if(fileName == null || "".equals(fileName)){
			System.out.println("Please set the config file");
			return null;
		}
		if(list == null){
			list = new ArrayList();
		}
		DocumentBuilder builder;
		IContentFactory factory = ContentFactory.instance();
		Document doc = null;
		Element eleb = null,elet = null;
		IBean bean = null;
		IProperty prop;
		NodeList beans; 
		NodeList props;
		NodeList cons;
		int i = 0,j = 0,countb = 0, countp = 0;
		try {
			builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
			doc = builder.parse(new BufferedInputStream(new FileInputStream(fileName)));
			eleb = doc.getDocumentElement();
			beans = eleb.getElementsByTagName("bean");
			countb = beans.getLength();
			for(;i < countb; i++){
				bean = factory.getBean();
				eleb = ((Element)beans.item(i));
				
				bean.setID(eleb.getAttribute("id"));
				bean.setClassName(eleb.getAttribute("class"));
				
				
				props = eleb.getElementsByTagName("property");
				countp = props.getLength();
				for(j = 0;j < countp; j++){
					prop = factory.getProperty();
					elet = (Element)props.item(j);
					
					prop.setName(elet.getAttribute("name"));
					prop.setType(elet.getAttribute("type"));
					prop.setRef(elet.hasAttribute("ref"));
					if(prop.isRef()){
						prop.setValue(elet.getAttribute("ref"));
					}else{
						prop.setValue(elet.getTextContent());
					}
					bean.addProperty(prop);
				}
				
				cons = eleb.getElementsByTagName("construct");
				if(cons.getLength() > 0){
					elet = (Element)cons.item(0);
					
					bean.setConstruct(elet.getAttribute("name"));
					
					props = elet.getElementsByTagName("param");
					countp = props.getLength();
					for(j = 0;j < countp; j++){
						prop = factory.getProperty();
						elet = (Element)props.item(j);
						
						prop.setName(elet.getAttribute("name"));
						prop.setType(elet.getAttribute("type"));
						prop.setRef(elet.hasAttribute("ref"));
						if(prop.isRef()){
							prop.setValue(elet.getAttribute("ref"));
						}else{
							prop.setValue(elet.getTextContent());
						}
						bean.addParam(prop);
					}
				}
				
				list.add(bean);
			}
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return list;
	}
{/code]

  
  
0
1
分享到:
评论

相关推荐

    XML高级编程pdf

    12.8 cXML—纵向行业的一个详细 例子 12.8.1 为什么有cXML 12.8.2 cXML协议规范 12.8.3 消息传输 12.9 第1步—横向行业 12.9.1 ASC X12 12.9.2 XML-EDIFACT 12.9.3 电子商务XML工作组 12.10 第1个横向步骤 ...

    XML 高级编程(高清版)

    12.8 cXML—纵向行业的一个详细 例子 12.8.1 为什么有cXML 12.8.2 cXML协议规范 12.8.3 消息传输 12.9 第1步—横向行业 12.9.1 ASC X12 12.9.2 XML-EDIFACT 12.9.3 电子商务XML工作组 12.10 第1个横向步骤 ...

    XML高级编程 (Extensible Markup Language)

    12.8 cXML—纵向行业的一个详细 例子 12.8.1 为什么有cXML 12.8.2 cXML协议规范 12.8.3 消息传输 12.9 第1步—横向行业 12.9.1 ASC X12 12.9.2 XML-EDIFACT 12.9.3 电子商务XML工作组 12.10 第1个横向步骤 ...

    Spring.NET学习笔记-实现一个简易的IoC框架

    通过这一点就可以告诉我们制作IoC容器需要写一个获取XML文件内容的方法和申明一个Dictionary, object&gt;来存放IoC容器中的对象,还需要写一个能从Dictionary, object&gt;中获取对象的方法。 全程手把手都你学习Srint.Net...

    XML高级编程

    12.8 cXML—纵向行业的一个详细 例子 535 12.8.1 为什么有cXML 535 12.8.2 cXML协议规范 536 12.8.3 消息传输 540 12.9 第1步—横向行业 546 12.9.1 ASC X12 546 12.9.2 XML-EDIFACT 547 12.9.3 电子商务XML工作组 ...

    jumeIOC:基于xml配置的IOC容器、对对象进行统一管理

    自己写IOC容器、不是闲着没事、而是深入理解IOC容器的实现方式、用到的技术点 dom4j解析xml文件、利用反射机制创建对象、使用Map集合作为容器、xml中配置的id 对应Map的key、value对应一个对象。主要学习思想、注解...

    unity3dUI简单的登录注册和背包

    新建一个画布(Canvas),再创建一个Panel容器,里面包含UI界面的所有UI控件,比如背包区的九个格子和装备区的三个格子,每个格子都是一个Button控件,背包区和装备区的这些按钮的父级分别是Bag和Equip两个空对象,...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释 15 1.6.5 处理指令 15 1.6.6 空白处理 16 1.6.7 行尾处理 16 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释 15 1.6.5 处理指令 15 1.6.6 空白处理 16 1.6.7 行尾处理 16 ...

    超级有影响力霸气的Java面试题大全文档

     对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释 15 1.6.5 处理指令 15 1.6.6 空白处理 16 1.6.7 行尾处理 16 ...

    Servlet知识点和示例

    (1)WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web 应用。 (2)ServletContext对象被包含在ServletConfig对象中,开发人员在编写servlet时,可以通过 this....

    使用Java的xml API、Java反射技术演示Spring的DI或者IoC原理

    3. 如果一切正常,你会看到使用Java集合、XML API,以及反射技术模拟Spring的get注入和自定义的IoC容器实现的例子--get注入了Hello类和一个MyFrame类,并且实例化之后可以运行! 4. 看一下testDemoSpringDI()方法,...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释 15 1.6.5 处理指令 15 1.6.6 空白处理 16 1.6.7 行尾处理 16 ...

    springboot+vue实现简单的前后端分离.zip

    Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...

    Spring面试题

    用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将...

    SpringBoot集成minio实现文件的上传,下载,获取列表,增加桶等的基本操作.zip

    Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...

    利用反射自实现IOC容器

    利用dom4j解析xml文件+反射创建对象 这是个maven项目,jdk1.8,Tomcat8.5

    SpringBoot的定时调用的加强工具,实现定时任务动态管理,后续加入可视化管理、调度日志、集群任务统一管理.zip

    Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...

Global site tag (gtag.js) - Google Analytics