zoukankan      html  css  js  c++  java
  • 一个简单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);
            }
        }
    }
  • 相关阅读:
    Eclipse EE 3.6 failed to create the java virtual machine 解决
    [收藏]家用三线插座(220V单相)正确接线方法
    Java设计模式 Design Pattern:包装模式 Decorator Pattern
    MIME 类型列表
    面试题参考
    循环队列的运用求K阶斐波那契序列
    加密技术仿射密码
    面试题集锦_1
    栈的运用(5)转换逆波兰式
    栈的运用(6)逆波兰式求值
  • 原文地址:https://www.cnblogs.com/gdwkong/p/8453159.html
Copyright © 2011-2022 走看看