【Spring】Ioc容器

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



🌟 一、概念

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容器

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值