1、通过bean工厂实现读取xml文件,并实例化对象,实现自动注入。
package com.pri.test;

import com.pri.factory.BeanFactory;
import com.pri.service.UserService;
import org.junit.Test; public class BeanFactoryTest { @Test
public 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;}

    @Override
public 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);
}
}
}

一个简单IOC与DI示例的更多相关文章

  1. 使用JAVA实现的一个简单IOC注入实例

    https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...

  2. 一个简单的JSP程序示例

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  3. 使用TensorFlow v2张量的一个简单的“hello world”示例

    使用TensorFlow v2张量的一个简单的"hello world"示例 import tensorflow as tf # 创建一个张量 hello = tf.constan ...

  4. 一个简单的Java死锁示例(转)

    在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子,程序说明都写着类的注释里了,有点罗嗦,但是应该也还是表述清楚了 ...

  5. 一个简单的Javascript闭包示例

    //=====用闭包实现函数的Curry化===== //数字求和函数的函数生成器 function addGenerator( num ){ //返回一个简单的匿名函数,求两个数的和,其中第一个数字 ...

  6. 一个简单的 ValueTask 的示例

    Task 确实有潜在的缺点,特别是对于实例创建很多  并且高吞吐量和性能是关键问题的场景  :  Task 是一个类.作为一个类,这意味着任何需要创建一个对象的操作都需要分配一个对象,分配的对象越多, ...

  7. [deviceone开发]-一个简单的表单示例

    一.简介 这个例子我们用do_ScrollView+do_LinearLayout来实现,当没有输入相关的值而去保存的时候,则把隐藏的几个提示Label显示出来,然后调用do_LinearLayout ...

  8. 从一个简单的Java单例示例谈谈并发

    一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static Un ...

  9. 从一个简单的Java单例示例谈谈并发 JMM JUC

    原文: http://www.open-open.com/lib/view/open1462871898428.html 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这 ...

随机推荐

  1. SQL 中用户建立与权限授予

    SQL 中用户建立与权限授予 一.原有 如果大家对我的博客动态非常关注的话,应该又看到我弄了一个随机MAN信息的小工具.但是呢,那个工具还有待加强(显示效果不是那么的好). 所以我就希望可以显示一些简 ...

  2. 读取图片信息(exif),使用com.drew.metadata.Metadata

    ---恢复内容开始--- 最近在开发中用到了metadata-extractor-xxx.jar 和 xmpcore-xxx.jar这个玩意, 索性查阅大量文章了解学习,来分享分享.本身工作也是经常和 ...

  3. jdk(1.8)命令行工具(二)

    2.3 jinfo:java配置信息工具 jinfo(Configuration Info for Java)的作用是实时的查看和调整虚拟机的各项参数.使用jps -v 可以查看虚拟机启动时显示指定的 ...

  4. Jmeter使用吞吐量控制器实现不同的用户操纵不同的业务

    一.需求 需求:博客系统,模拟用户真实行为,80%的用户阅读文章,20%的用户创建文章,创建文章的用户随机的删除或者修改文章. 二.脚本实现 80%的用户查看文章 20%用户创建文章 根据post_i ...

  5. Python中 '==' 与'is' 以及它们背后的故事

    摘要 比较判断逻辑是在代码中经常使用的,在Python中常用 '==' 和 is 来做比较判断. ==  :  双等号是用来比较变量所指向内存单元中的值是否相等,它只关心值,并不在意值的内存地址,也就 ...

  6. jpetStore 学习总结(2)

    在写jpetstore时,最难理解的应该是数据库还有每个表之间的关系了,我在这里对数据库简单的介绍. 以下是数据库的所有表:    account表是个人信息表,里面包括用户的名字,邮箱,地址,哪个城 ...

  7. 爬虫之chrome浏览器的使用方法

    chrome浏览器使用方法介绍 1. 新建隐身窗口 1.1 为什么需要新建隐身窗口 在打开隐身窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,不携带cookie.这样就 ...

  8. linux下启动tomcat服务的命令是什么

    Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/local/ ...

  9. <VS2017> 编写VC++单元测试 -(一)新建单元测试工程

    开发人员自己编写单元测试是一个非常好的习惯.单元测试不但能够验证自己所编写的代码是否存在问题,避免提交给测试人员时才发现bug,也可以为将来改动代码的人提供验证代码功能正确性的途径.在我有限的工作生涯 ...

  10. 让 Linux grep 的输出不换行

    在Redhat中亲测. 本来ps -ef的输出是不会换行的,但是 ps -ef | grep java 就换行了. 如果想让grep完的结果不要换行,找到两种方法. 1. 在后面拼接 less -S: ...