• 手写一个IOC容器


    链接:https://pan.baidu.com/s/1MhKJYamBY1ejjjhz3BKoWQ
    提取码:e8on

    明白什么是IOC容器:

    IOC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

    传统的java代码中,我们需要使用哪个对象,就new一个对象,很正常对吧?

    然而,这时出现了一个新思想:IOC(控制反转)

    由它创建和管理所有的对象,我们需要的时候,只需要拿就可以了。这种思想的产生,主要是为了解耦。在软件工程中,我们常常要求设计出高内聚,低耦合的软件。这种思想显然是符合这一点的。

    首先创建一个java web项目

     文件目录如下:

    由于是使用IOC容器,所以我们需要手写application.xml文件,并解析其中的<bean>标签来创建相应的对象

    application.xml文件内容如下:

    1 <?xml version="1.0" encoding="utf-8" ?>
    2 <beans>
    3     <bean class="top.bigking.service.HelloService" id="helloService" />
    4 </beans>

    可以看到,只有一个id为helloService的bean

    由于要解析xml文件,所以我们需要添加dom4j.jar包

    接下来我们开始写BigKingApplicationContext.java 来解析xml文件

    抽出其中比较重要的一段代码:

     1     private void parseApplication(){
     2         URL url = this.getClass().getClassLoader().getResource(this.applocationConfigURL);
     3         if(url == null) {
     4             System.out.println("资源不存在!");
     5             return;
     6         }
     7         SAXReader reader = new SAXReader();
     8         try {
     9             Document document = reader.read(url);
    10             List<Element> elementList = document.selectNodes("/beans/bean");
    11             elementList.forEach(element -> {
    12                 String id = element.attributeValue("id");
    13                 String clazz = element.attributeValue("class");
    14                 BigKingBean bigKingBean = new BigKingBean(id, clazz);
    15                 bigKingBeanList.add(bigKingBean);
    16             });
    17 
    18         } catch (DocumentException e) {
    19             e.printStackTrace();
    20         }
    21     }

    可以看到,我们使用dom4j解析了xml文件,获取了helloService这个bean的相关信息

    并且通过一个BigKingBean类来new了一个对象,通过这个Bean类,我们就可以把application.xml中写的所有bean对象全部new出来

    那么我们继续回到IOC(控制反转)的概念

    IOC容器的作用是创建和管理对象,我们现在实现了创建,怎么管理呢?

    我们引入IOC容器的概念,目的就是为了方便管理。当我们需要的时候,直接拿来用就可以了,所以,我们应该提供一个根据id取对象的方法,为了实现这个目的,我们需要在BigKingApplicationContext这个解析类中增加一个map集合,key是对象id,值是对象(并且是Object类型)

    这一部分的关键代码为:

     1     private void generatorBean(){
     2         if(CollectionUtils.isEmpty(bigKingBeanList)) return;
     3         bigKingBeanList.forEach(bigKingBean -> {
     4             try {
     5                 map.put(bigKingBean.getId(), Class.forName(bigKingBean.getClazz()).newInstance());
     6             } catch (InstantiationException e) {
     7                 e.printStackTrace();
     8             } catch (IllegalAccessException e) {
     9                 e.printStackTrace();
    10             } catch (ClassNotFoundException e) {
    11                 e.printStackTrace();
    12             }
    13         });
    14     }
    15     @Override
    16     public Object getBeans(String id){
    17         return map.get(id);
    18     }
    金麟岂是池中物,一遇风云便化龙!
  • 相关阅读:
    idea 插件之 SequenceDiagram
    idea 中添加mybatis的mapper文件模板
    springBoot 中 logback配置文件详解
    Mysql show processlist、show profiles 排查问题
    input 输入框效验
    Java基础之comparator和comparable的区别以及使用
    mysql sql使用记录
    mysql 优化之索引的使用
    IDEA 中常用快捷键的使用
    form表单中method的get和post区别
  • 原文地址:https://www.cnblogs.com/ABKing/p/12018182.html
Copyright © 2020-2023  润新知