【Spring】Ioc容器

博客主页:我的主页
欢迎点赞 收藏 留言 欢迎讨论!
本文由 【泠青沼~】 原创,首发于 CSDN
由于博主是在学小白一枚,难免会有错误,有任何问题欢迎评论区留言指出,感激不尽!个人主页


目录

  • 一、概念
  • 二、建立一个简单的Ioc容器
    • 2.1、编写需要读取的JSON文件
    • 2.2、解析JSON文件信息类
    • 2.3、测试实体类
    • 2.4、IOC容器


一、概念

IoC 英文全称是 Inversion of Control,即控制反转。控制反转是一个面向对象设计原则,可以用来降低计算机代码之间的耦合度。常见的实现方式是依赖注入 DI(Dependency Injection)

在使用 IoC 容器之前,在Java 代码中,A 类中需要使用到 B 对象,用法如下:

class B{}
class A{
    B b = new B();
}

像以上的代码,A中需要使用B对象,那么就在A中创建B对象,B对象的控制权就在A中

我们使用 IoC 容器,相当于有一个 Container,用来存放所有Bean。继续像以上的例子,当项目启动的时候,A 和 B 都会将自己的信息告知给 Spring 容器,例如将自己类的全路径、将来创建出来 Bean 的名称等等信息都告诉 Spring 容器,Spring 容器就可以根据这些已有的信息创建出来相应的对象,这些创建出来的对象都是由 Spring 容器进行管理的。A 中需要使用 B 对象,就不用自己去创建 B 对象了,而是直接去跟 Spring 容器请求一个 B 对象。此时,由于 B 对象是Spring容器创建出来的,B 对象的控制权就归属于 Spring 容器。
相比于用 IoC 容器之前,B 对象的控制权由 A 对象中转移到 Spring 容器中,B 对象的控制权反转了,这就是控制反转

二、建立一个简单的Ioc容器

2.1、编写需要读取的JSON文件

分别是两个实体类的路径信息,还有实体类的id,是一个集合可以包含多个实体类

[{
  "class_": "com.dong.Dog",
  "id": "dog"
},{
  "class_": "com.dong.Cat",
  "id": "cat"
}]

2.2、解析JSON文件信息类

/**
 * 这个类是用来接收,解析json文件中的各个字段,分别对应json文件中的各个实体类的字段
 */
public class BeanDefination {
    private String class_;
    private String id;

    public String getClass_() {
        return class_;
    }

    public void setClass_(String class_) {
        this.class_ = class_;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

2.3、测试实体类

public class Cat {
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Cat{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    ...省略get和set
}
public class Dog {
    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
     ...省略get和set
}

2.4、IOC容器

 public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //自定义spring容器container
        HashMap<String, Object> container = new HashMap<>();
        //定义读入流
        ObjectMapper om = new ObjectMapper();
        //读入bean定义流json
        List<BeanDefination> beanDefinations = om.readValue(demo01.class.getResourceAsStream("/beans.json"), new TypeReference<List<BeanDefination>>() {
            @Override
            public Type getType() {
                return super.getType();
            }
        });
        for (BeanDefination bd : beanDefinations) {
            String class_ = bd.getClass_();
            String id = bd.getId();

            //获取到类的全路径,调用构造方法,获取实例
            Object instance = Class.forName(class_).getConstructor().newInstance();
            container.put(id,instance);
        }
        Dog dog = (Dog)container.get("dog");
        Cat cat = (Cat) container.get("cat");
        System.out.println(dog.toString());
        System.out.println(cat.toString());

    }

通过反射获取到类的路径,直接调用构造方法,获取实例,实现了一个简单的IOC容器

你可能感兴趣的:(Spring源码,spring,java,后端)