美文网首页
简单的 IOC

简单的 IOC

作者: 程序男保姆 | 来源:发表于2020-04-03 11:57 被阅读0次

简单的 IOC

  1. 先从简单的 IOC 容器实现开始,最简单的 IOC 容器只需4步即可实现,如下:

  2. 加载 xml 配置文件,遍历其中的标签

  3. 获取标签中的 id 和 class 属性,加载 class 属性对应的类,并创建 bean

  4. 遍历标签中的标签,获取属性值,并将属性值填充到 bean 中
    将 bean 注册到 bean 容器中

如上所示,仅需4步即可,是不是觉得很简单。好了,Talk is cheap, Show me the code. 接下来要上代码了。不过客官别急,上代码前,容我对代码结构做一下简单介绍:

SimpleIOC// IOC 的实现类,实现了上面所说的4个步骤
SimpleIOCTest// IOC 的测试类
Car// IOC 测试使用的 bean
Wheel// 同上
ioc.xml// bean 配置文件
容器实现类 SimpleIOC 的代码:

容器测试使用的 bean 代码:

publicclassCar{

privateString name;

privateString length;

privateString width;

privateString height;

privateWheel wheel;

// 省略其他不重要代码

}
publicclassWheel{

privateString brand;

privateString specification ;

// 省略其他不重要代码

}

bean 配置文件 ioc.xml 内容:

IOC 测试类 SimpleIOCTest:

publicclassSimpleIOCTest{

@Test

publicvoidgetBean()throwsException{

String location = SimpleIOC.class.getClassLoader().getResource("spring-test.xml").getFile();

SimpleIOC bf =newSimpleIOC(location);

Wheel wheel = (Wheel) bf.getBean("wheel");

        System.out.println(wheel);

Car car = (Car) bf.getBean("car");

        System.out.println(car);

    }

}

测试结果:

image

以上是简单 IOC 实现的全部内容,难度不大,代码也不难看懂,这里不再多说了。下面说说简单 AOP 的实现。

publicclassSimpleIOC{

privateMap beanMap =newHashMap<>();

publicSimpleIOC(String location)throwsException{

        loadBeans(location);

    }

publicObjectgetBean(String name){

        Object bean = beanMap.get(name);

if(bean ==null) {

thrownewIllegalArgumentException("there is no bean with name "+ name);

        }

returnbean;

    }

privatevoidloadBeans(String location)throwsException{

// 加载 xml 配置文件

InputStream inputStream =newFileInputStream(location);

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

        DocumentBuilder docBuilder = factory.newDocumentBuilder();

        Document doc = docBuilder.parse(inputStream);

        Element root = doc.getDocumentElement();

        NodeList nodes = root.getChildNodes();

// 遍历 <bean> 标签

for(inti =0; i < nodes.getLength(); i++) {

            Node node = nodes.item(i);

if(nodeinstanceofElement) {

                Element ele = (Element) node;

String id = ele.getAttribute("id");

String className = ele.getAttribute("class");



// 加载 beanClass

Class beanClass =null;

try{

                    beanClass = Class.forName(className);

}catch(ClassNotFoundException e) {

                    e.printStackTrace();

return;

                }

// 创建 bean

                Object bean = beanClass.newInstance();

// 遍历 <property> 标签

NodeList propertyNodes = ele.getElementsByTagName("property");

for(intj =0; j < propertyNodes.getLength(); j++) {

                    Node propertyNode = propertyNodes.item(j);

if(propertyNodeinstanceofElement) {

                        Element propertyElement = (Element) propertyNode;

String name = propertyElement.getAttribute("name");

String value = propertyElement.getAttribute("value");

// 利用反射将 bean 相关字段访问权限设为可访问

                        Field declaredField = bean.getClass().getDeclaredField(name);

declaredField.setAccessible(true);

if(value !=null&& value.length() >0) {

// 将属性值填充到相关字段中

                            declaredField.set(bean, value);

}else{

String ref = propertyElement.getAttribute("ref");

if(ref ==null|| ref.length() ==0) {

thrownewIllegalArgumentException("ref config error");

                            }



// 将引用填充到相关字段中

                            declaredField.set(bean, getBean(ref));

                        }

// 将 bean 注册到 bean 容器中

                        registerBean(id, bean);

                    }

                }

            }

        }

    }

privatevoidregisterBean(String id, Object bean){

        beanMap.put(id, bean);

    }

}

```

相关文章

  • 简单的 IOC

    简单的 IOC 先从简单的 IOC 容器实现开始,最简单的 IOC 容器只需4步即可实现,如下: 加载 xml 配...

  • 简单IOC的实现

    简单IOC的实现 1.背景介绍 IoC是什么 Ioc—Inversion of Control,即“控制反转”,不...

  • 自定义IOC框架

    一、IOC简单科普 所谓IOC,即控制反转(Inversion of Control,英文缩写为IoC) 假如你的...

  • 自定义一个Android IOC框架

    一、IOC简单科普 所谓IOC,即控制反转(Inversion of Control,英文缩写为IoC) 假如你的...

  • Spring IOC 和 AOP

    简单IOC和AOP实现 IOC 1.简述 控制反转(Inversion of Control,缩写为IoC),是面...

  • 详解Spring IOC

    Spring IOC其实很简单  我们通常提到的Spring IOC,实际上是指Spring框架提供的IOC容器实...

  • [源码]springboot源码中一窥BeanFactory接口

    先聊聊IOC IoC(Inversion of Control) 控制反转,是spring框架的精髓,简单来说,就...

  • 徒手撸一个简单的IOC

    徒手撸一个简单的IOC Spring框架中最经典的两个就是IOC和AOP,其中IOC(Inversion of C...

  • 使用注解实现一个Android的IoC框架

    一、 概述 IoC,就是控制反转(Inversion of Control),缩写为 IoC。简单来说,就是不需要...

  • SpringIOC原理,beanFactory和factoryB

    一、什么是IOC IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。简单来说就是...

网友评论

      本文标题:简单的 IOC

      本文链接:https://www.haomeiwen.com/subject/tfhhphtx.html