美文网首页
简单的 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

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