• 【Spring】Ioc容器


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



    🌟 一、概念

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

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

    class B{}
    class A{
        B b = new B();
    }
    
    • 1
    • 2
    • 3
    • 4

    像以上的代码,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"
    }]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🌟🌟 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;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    🌟🌟 2.3、测试实体类

    public class Cat {
        private String name;
        private Integer age;
    
        @Override
        public String toString() {
            return "Cat{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
        ...省略get和set
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    public class Dog {
        private String name;
        private Integer age;
    
        @Override
        public String toString() {
            return "Dog{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
         ...省略get和set
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    🌟🌟 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());
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

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

  • 相关阅读:
    Socket.io实时通信的一些杂论
    活动回顾 | 数字外贸私享会【上海站】成功举办
    Electronica上海 Samtec 验证演示 | FireFly™Micro Flyover System™
    Python Faker库造伪数据
    基于Fluent求解器进行二次开发到底怎么做?
    Android 13.0 SystemUI状态栏屏蔽掉通知栏不显示通知
    以分割栅格为例实现FME模板的方案优化
    DM工作笔记-DATEADD(指定日期添加n个时间段)函数和其他时间函数
    PassUAC的简单实现(二)
    mac新手入门(快捷键)
  • 原文地址:https://blog.csdn.net/m0_46635265/article/details/132841754