首页 > 代码库 > 谈谈依赖注入DI

谈谈依赖注入DI

  控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。

  这其实是一种设计模式,目的是为了减少硬编码和对象中的强依赖。

  

  就是要提供一个容器,由容器来完成(1)具体ServiceProvider的创建(2)ServiceUser和ServiceProvider的运行时绑定。依赖并未消失,只是延后到了容器被构建的时刻。在这样的体系结构里,ServiceUser、ServiceProvider和容器都是稳定的,互相之间也没有任何依赖关系;所有的依赖关系、所有的变化都被封装进了容器实例的创建过程里,符合我们对服务应用的理解。这种思想在spring 框架的一个重点和angularjs里面都有涉及到。

  我就看一下spring是如何依赖注入的。它是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中。

public static Object newInstance(String className) {        Class<?> cls = null;        Object obj = null;        try {            cls = Class.forName(className);            obj = cls.newInstance();        } catch (ClassNotFoundException e) {            throw new RuntimeException(e);        } catch (InstantiationException e) {            throw new RuntimeException(e);        } catch (IllegalAccessException e) {            throw new RuntimeException(e);        }        return obj;    }

  接着它将这个类注入进去

public static void setProperty(Object obj, String name, String value) {        Class<? extends Object> clazz = obj.getClass();        try {            String methodName = returnSetMthodName(name);            Method[] ms = clazz.getMethods();            for (Method m : ms) {                if (m.getName().equals(methodName)) {                    if (m.getParameterTypes().length == 1) {                        Class<?> clazzParameterType = m.getParameterTypes()[0];                        setFieldValue(clazzParameterType.getName(), value, m,                                obj);                        break;                    }                }            }        } catch (SecurityException e) {            throw new RuntimeException(e);        } catch (IllegalArgumentException e) {            throw new RuntimeException(e);        } catch (IllegalAccessException e) {            throw new RuntimeException(e);        } catch (InvocationTargetException e) {            throw new RuntimeException(e);        }}

最后它将这个类的实例返回给我们,我们就可以用了。

if (value instanceof Map) {                Iterator<?> entryIterator = ((Map<?, ?>) value).entrySet()                        .iterator();                Map<String, Object> map = new HashMap<String, Object>();                while (entryIterator.hasNext()) {                    Entry<?, ?> entryMap = (Entry<?, ?>) entryIterator.next();                    if (entryMap.getValue() instanceof String[]) {                        map.put((String) entryMap.getKey(),                                getBean(((String[]) entryMap.getValue())[0]));                    }                }                BeanProcesser.setProperty(obj, property, map);            }

 

谈谈依赖注入DI