1、通过bean工厂实现读取xml文件,并实例化对象,实现自动注入。
package com.pri.test;import com.pri.factory.BeanFactory;
import com.pri.service.UserService;
import org.junit.Test;public class BeanFactoryTest {@Testpublic void test(){BeanFactory beanFactory = BeanFactory.getBeanFactory();UserService user = (UserService)beanFactory.getBean("user");user.save();}
}

2、xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans ><bean id="user" class="com.pri.service.impl.UserServiceImpl01"><property name="name" value="李四"/></bean>
</beans>

3、实例对象:

package com.pri.service.impl;import com.pri.service.UserService;

public class UserServiceImpl01 implements UserService{private String name;public String getName() { return name;}public void setName(String name) { this.name = name;}@Overridepublic void save(){System.out.println("UserService被调用........::"+name);}
}

4、BeanFactory工厂:

package com.pri.factory;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class BeanFactory {/*** 私有化构造,禁止以new的方式获取BeanFactory实例*/private BeanFactory(){}/*** 静态内部类,保证只有一个BeanFactory*/static class SingleBeanFactory{static BeanFactory BEANFACTORY = new BeanFactory();}/*** 对外提供一个获取BeanFactory方法* @return*/public static BeanFactory getBeanFactory(){return SingleBeanFactory.BEANFACTORY;}public Object getBean(String id) {try {Element element = getElement(id);String classPath = element.attribute("class").getValue();//根据类的全限定名创建Class对象Class<?> clazz = Class.forName(classPath);//创建实例Object obj = clazz.newInstance();//为bean对象赋值
            setAttributeValue(clazz,element,obj);return obj;} catch (Exception e) {e.printStackTrace();return null;}}private  Element getElement(String id) throws DocumentException {SAXReader saxReader = new SAXReader();Document document = saxReader.read("src/myconfig.xml");//精确定位到id属性值为传入字符串的bean元素return (Element) document.selectSingleNode("//bean[@id='" + id + "']");}private void setAttributeValue(Class<?> clazz, Element element,Object obj) throws IntrospectionException, IllegalAccessException, InvocationTargetException {Element subElement = element.element("property");//使用set方法赋值if (subElement != null) {String name = subElement.attributeValue("name");String valueStr = subElement.attributeValue("value");//创建属性描述器PropertyDescriptor descriptor = new PropertyDescriptor(name, clazz);//获取该属性的修饰符String s = descriptor.getPropertyType().getName();//获得写方法Method writeMethod = descriptor.getWriteMethod();//调用写方法Object value = null;if (s.equalsIgnoreCase("int")){value = Integer.parseInt(valueStr);}else if (s.equalsIgnoreCase("long")){value = Long.parseLong(valueStr);}else if (s.equalsIgnoreCase("short")){value = Short.parseShort(valueStr);}else if (s.equalsIgnoreCase("double")){value = Double.parseDouble(valueStr);}else if (s.equalsIgnoreCase("float")){value = Float.parseFloat(valueStr);}else if (s.equalsIgnoreCase("byte")) {value = Byte.valueOf(valueStr);}else{value = valueStr;}writeMethod.invoke(obj, value);}}
}

转载于:https://www.cnblogs.com/gdwkong/p/8453159.html

一个简单IOC与DI示例相关推荐

  1. 用opengl编写一个简单的画图软件示例代码

    //用opengl编写一个简单的画图软件示例代码(存在闪烁问题) //本代码,抄写自一本教授opengl的书,可惜,里面的代码存在一些问题,导致不能正常显示,现在是增加了一些语句的代码 #includ ...

  2. php简单的购物车,利用PHP实现一个简单购物车的demo示例代码

    利用PHP实现一个简单购物车的demo示例代码 数据结构跟关于PHP写购物车大体差不多,这里站长主要就购物车的主要业务逻辑进行一下说明: 1.用户未登陆时只能浏览商品,不能将其加入购物车 2.当未登陆 ...

  3. 一个简单的Java EEDocker示例

    本文讲的是一个简单的Java EE&Docker示例,[编者的话]学习Docker的最好办法就是迅速在工作中应用它,本文作者使用Docker部署了一个Java EE应用,非常简单和方便.需要注 ...

  4. html抓取文章,网页抓取工具:一个简单的文章采集示例

    通过采集网页抓取工具火车采集器官网的faq为例来说明采集器采集的原理和过程. 本例以 http://faq.locoy.com/qc-12.html 演示地址,以火车采集器V9为工具进行示例说明. ( ...

  5. C语言学习笔记---一个简单的文件压缩示例

      通过一个简单的文件文件压缩例子,来学习文件操作的相关函数.该程序以只读的方式 "r" 打开第一个文件,以只写的方式"w"打开第二个文件.将第一个文件中每隔3 ...

  6. 一个简单的生产消费者示例

    前言:打算回顾一下以前学过的知识点,先以一个小程序开始吧 下面的代码是中午刚写的,传统的synchronized.while.wait.notifyAll的示例就不写了 1 package com.m ...

  7. 一个简单的ARM7汇编程序示例详解

    先上完整的示例 代码 : 1.calc.S AREA CALC, CODE, READONLYEXPORT asm_add;定义了一个叫 asm_add 的子程序,我们在C语言里会传递两个参数.参数占 ...

  8. 一个简单的插件框架示例

    闲言不讲,直接上代码,如下三个文件,分属三个项目. using System; using System.Collections.Generic; using System.IO; using Sys ...

  9. C++ STL 一个简单的文件输入输出示例

    //本程序实例简单介绍C++如何读写文件 #include <iostream> #include <fstream> #include <string> usin ...

最新文章

  1. 【问题解决】移动端rem适配的时候会出现打开页面时先缩小(放大)后恢复到正常页面的问题
  2. 20175318 2018-2019-2 《Java程序设计》第4周学习总结
  3. python声明_【瞎折腾-03】在Python里面写类型“声明”
  4. boost::stl_interfaces::reverse_iterator相关的测试程序
  5. 在 Tomcat 中部署 Java Web 程序 ( jar cvf *.war */. ) war 包
  6. GitHub 撤销 commit
  7. 显卡报错测试软件,显卡识别软件GPU-Z更新至2.3.0,彻底揭开RX Vega面纱
  8. 如何高效学习web_使用高效的Web工具改善您的业务
  9. arduino pro mini 迷你 ATmega328P 程序下载 usb-ttl reset
  10. 《系统集成项目管理》第一章 信息化知识
  11. dockr pull 无法拉取镜像提示找不到注册表
  12. matlab点集配准,matlab练习程序(对应点集配准的四元数法)
  13. Json和其序列化和反序列化
  14. mongoose简单了解
  15. 提问的艺术 | 如何聪明地提问
  16. 【从零开始学C语言】知识总结一:C语言的基本知识汇总
  17. 富士康的二手iPhone生意再度遭遇危机
  18. OSChina 周二乱弹 —— 明天你是否会想起
  19. JS检测是否有企业微信应用程序
  20. mybatis 字符串比较 == 用法

热门文章

  1. fieldset在ie8下的margin\padding bug规避
  2. 列出本机正在监控的端口
  3. 鱼相忘于江湖,人相忘于道术
  4. unix_timestamp 时间戳函数用法(hive)
  5. Android程序员一年工作经验能重复用十年?高效学习很重要!
  6. zookeeper系列(二)实战master选举
  7. 56. Netty源代码分析-服务器初始化 NioEventLoopGroup实例化
  8. 《中国人工智能学会通讯》——10.22 能源互联网时代
  9. 部署ajax服务-支持jsonp
  10. Shuttle ESB实现消息推送