- 浏览: 7887 次
- 性别:
- 来自: 上海
最新评论
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
实现ApplicationContent
IXMLParse
实现BeanParse
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]
- Patterns.rar (29.4 KB)
- 下载次数: 1
发表评论
-
JVM 内存优化
2013-12-09 16:06 3451.打印gc日志 eclipse.ini文件配置如下 -vma ... -
Spring 3.0 后台任务
2013-01-10 09:57 414配制文件: <beans xmlns="h ... -
Spring quartz 后台任务
2013-01-09 16:05 1023项目中经常有用到后台任务的情况,因此稍做记录。 业务类: ... -
Java 日期处理
2012-12-18 15:55 406获取上个月最后一天 http://www.oschina.n ... -
Java 一些容易出错小问题
2012-11-30 09:47 727List<String>[] list = n ... -
Scanner 一点经验
2009-07-29 12:15 708Scanner 一点经验 原样缓存所有键盘输入至缓冲区。用各 ...
相关推荐
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个横向步骤 ...
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个横向步骤 ...
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个横向步骤 ...
通过这一点就可以告诉我们制作IoC容器需要写一个获取XML文件内容的方法和申明一个Dictionary, object>来存放IoC容器中的对象,还需要写一个能从Dictionary, object>中获取对象的方法。 全程手把手都你学习Srint.Net...
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工作组 ...
自己写IOC容器、不是闲着没事、而是深入理解IOC容器的实现方式、用到的技术点 dom4j解析xml文件、利用反射机制创建对象、使用Map集合作为容器、xml中配置的id 对应Map的key、value对应一个对象。主要学习思想、注解...
新建一个画布(Canvas),再创建一个Panel容器,里面包含UI界面的所有UI控件,比如背包区的九个格子和装备区的三个格子,每个格子都是一个Button控件,背包区和装备区的这些按钮的父级分别是Bag和Equip两个空对象,...
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 ...
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 ...
对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。 Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...
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 ...
(1)WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web 应用。 (2)ServletContext对象被包含在ServletConfig对象中,开发人员在编写servlet时,可以通过 this....
3. 如果一切正常,你会看到使用Java集合、XML API,以及反射技术模拟Spring的get注入和自定义的IoC容器实现的例子--get注入了Hello类和一个MyFrame类,并且实例化之后可以运行! 4. 看一下testDemoSpringDI()方法,...
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 ...
Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...
用户提交表单时,一个配置好的ActionForm对象被创建,并被填入表单相应的数据,ActionServler根据Struts-config.xml文件配置好的设置决定是否需要表单验证,如果需要就调用ActionForm的 Validate()验证后选择将...
Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...
利用dom4j解析xml文件+反射创建对象 这是个maven项目,jdk1.8,Tomcat8.5
Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...