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. Java文件字节流和字符流

    输入流:只能从中读取数据,不能向其写入数据. InputStream,Reader 输出流:只能向其中写入数据,不能从中读取数据. OutputStream, Writer 输入流是相对于程序而言,外 ...

  2. JVM调优总结 -Xms -Xmx -Xmn -Xss(转自:iteye unixboy)

    堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制:系统的可用虚拟内存限制:系统的可用物理内存限制.32位系统下,一般限制在1.5G~2G:64为操作 ...

  3. linux之getenv putenv setenv和unsetenv详解

    1.getenv函数 头文件:#include<stdlib.h> 函数原型: char * getenv(const char* name); 函数说明:getenv()用来取得参数na ...

  4. 使用hexo+coding搭建免费个人博客

    1.检测node和npm 先检测一下有没有node.js和npm $ node -v //如果有,说明node.js安装成功! $ node -v v8.4.0 //如果有,说明npm安装成功! $n ...

  5. CSS04--对齐、 布局、导航栏

    我们接着上一章,继续学习一些有关对齐.布局.导航栏的内容. 1.水平块对齐:    1.1 margin:把左和右外边距设置为 auto,规定的是均等地分配可用的外边距.结果就是居中的元素    .c ...

  6. 阿里云服务器18个数据中心测试IP地址以及测试方法

    我们用户在选择阿里云服务器的时候是不是感觉阿里云的数据中心太多太多,确实阿里云服务器机房是有很多,国外国外机房大约有18个,甚至更多,因为还在不断的增加机房.对于商家而言增加不同的机房可以满足不同的项 ...

  7. Android Fragment向另一个Activity传值

    1.Fragment内: Intent intent=new Intent(getActivity(),ShowDataActivity.class); //参数1:Fragment所依存的Activ ...

  8. python 全栈开发:数据类型整体分析

    数据类型初始 数据类型:    int :用于计算. 例子:1.2.3.4........................... 常用方法操作: bit_length()   ps:求一个数字转换成二 ...

  9. Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting

    解决方法: find / -name supervisor.sock unlink /name/supervisor.sock 2. www-data 用户是干什么用的 3.如何通过superviso ...

  10. MySQL 备份数据库

    一.数据备份 1.备份一个数据库 mysqldump基本语法: mysqldump -u username -p dbname table1 table2 ...-> BackupName.sq ...