🎈博客主页:🌈我的主页🌈
🎈欢迎点赞 👍 收藏 🌟留言 📝 欢迎讨论!👏
🎈本文由 【泠青沼~】 原创,首发于 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;@Overridepublic String toString() {return "Cat{" +"name='" + name + '\'' +", age=" + age +'}';}...省略get和set
}
public class Dog {private String name;private Integer age;@Overridepublic 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容器containerHashMap<String, Object> container = new HashMap<>();//定义读入流ObjectMapper om = new ObjectMapper();//读入bean定义流jsonList<BeanDefination> beanDefinations = om.readValue(demo01.class.getResourceAsStream("/beans.json"), new TypeReference<List<BeanDefination>>() {@Overridepublic 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容器