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. jquery源码解析:attr,prop,attrHooks,propHooks详解

    我们先来看一下jQuery中有多少个方法是用来操作元素属性的. 首先,看一下实例方法: 然后,看下静态方法(工具方法): 静态方法是内部使用的,我们外面使用的很少,实例方法才是对外的. 接下来,我们来 ...

  2. Tensorflow入门----占位符、常量和Session

    安装好TensorFlow之后,开一个python环境,就可以开始运行和使用TensorFlow了. 先给一个实例, #先导入TensorFlow import tensorflow as tf he ...

  3. (JAVA作业)练习:创建一个类名为Fruit;包含实例变量:水果名称,颜色,价格,上市月份,有无种子 10个实例:苹果,香蕉,芭乐,柚子,李子,杨桃,猕猴桃,哈密瓜,葡萄,榴莲; 实现功能:提示用户输入水果品种编号,输出该水果的全部信息。

    class Lei { String name; String color; int price; int date; int num; String zz; void assemble(){ Sys ...

  4. 南昌网络赛 I. Max answer (单调栈 + 线段树)

    https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...

  5. (转)我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  6. javascript中Function与Object

    1. 先来一段代码: console.log(Function); // function Function() { [native code] } console.log(Object); // f ...

  7. 通过java代码给log4j指定appender

    工具代码 import org.apache.log4j.ConsoleAppender; import org.apache.log4j.LogManager; import org.apache. ...

  8. 001-Servlet模板

    package ${enclosing_package}; import java.io.IOException; import javax.servlet.ServletException; imp ...

  9. python爬虫的教程

    来源:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一 ...

  10. vue测试安装和配置

    npm install --save-dev @vue/test-utils mocha mocha-webpack npm install --save-dev jsdom jsdom-global ...