一个简单IOC与DI示例

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);
        }
    }
}

原文地址:https://www.cnblogs.com/gdwkong/p/8453159.html

时间: 2024-10-15 14:53:13

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

一个简单的Javascript闭包示例

//=====用闭包实现函数的Curry化===== //数字求和函数的函数生成器 function addGenerator( num ){ //返回一个简单的匿名函数,求两个数的和,其中第一个数字来自于函数生成器 return function( toAdd ){ return num + toAdd; } } //addFive是一个求5加上一个参数的和的函数 var addFive = addGenerator( 5 ); alert(addFive( 5 ) == 10);//true

一个简单的java死锁示例

在实际编程中,要尽量避免出现死锁的情况,但是让你故意写一个死锁的程序时似乎也不太简单(有公司会出这样的面试题),以下是一个简单的死锁例子. 线程的同步化可能会造成死锁,死锁发生在两个线程相互持有对方正在等待的东西(实际是两个线程共享的东西).只要有两个线程和两个对象就可能产生死锁. package sxh.java.lock; /** * 一个简单的死锁类 * 当DeadLock类的对象flag==1时(td1),先锁定o1,睡眠500毫秒 * 而td1在睡眠的时候另一个flag==0的对象(t

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

一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static UnsafeLazyInitiallization instance; private UnsafeLazyInitiallization() { } public static UnsafeLazyInitiallization getInstance(){ if(instance==null){ /

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

原文: http://www.open-open.com/lib/view/open1462871898428.html 一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static UnsafeLazyInitiallization instance; private UnsafeLazyInitiallization() { } public static U

一个简单的Java单例示例谈谈并发

一个简单的单例示例 单例模式可能是大家经常接触和使用的一个设计模式,你可能会这么写 public class UnsafeLazyInitiallization { private static UnsafeLazyInitiallization instance; private UnsafeLazyInitiallization() { } public static UnsafeLazyInitiallization getInstance(){ if(instance==null){ /

深入解析spring的IOC和DI

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">在此之前先说一下没有</span><span style="font-family: 'Times New Roman'; background-color: rgb(255, 255, 255);">spring</span>&l

简单的Spring Batch示例

使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算. 现在写一个简单的入门版示例. 这里默认大家已经掌握了Spring Batch的基本知识,示例只是为了快速上手实践 目标1:程序随机生成字符串,经过Spring Batch后,统一在字符串后加入"----PROCESSED",并输出 目标2:程序读取txt文件,经过Spring Batch后,统一加入如上字段,并输出 Spring Batch的流程 读取数据----itemReader 处理数据---

简单理解IoC与DI

为了理解Spring的IoC与DI从网上查了很多资料,作为初学者,下面的描述应该是最详细,最易理解的方式了. 首先想说说IoC(Inversion of Control,控制倒转).这是spring的核心,贯穿始终.所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好.qq号.电话号.ip号.iq号………,想办法认识她们,

IDDD 实现领域驱动设计-一个简单的 CQRS 示例

上一篇:<IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)> 学习架构知识,需要有一些功底和经验,要不然你会和我一样吃力,CQRS.EDA.ES.Saga 等等,这些是实践 DDD 所必不可少的架构,所以,如果你不懂这些,是很难看懂上篇所提到的 CQRS Journey 和 ENode 项目,那怎么办呢?我们可以从简单的 Demo 一点一滴开始. 代码地址:https://github.com/yuezhongxin/CQRS.Sample 说明:一张很丑陋的