博客主页:我的主页
欢迎点赞 收藏 留言 欢迎讨论!
本文由 【泠青沼~】 原创,首发于 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 对象的控制权反转了,这就是控制反转
分别是两个实体类的路径信息,还有实体类的id,是一个集合可以包含多个实体类
[{
"class_": "com.dong.Dog",
"id": "dog"
},{
"class_": "com.dong.Cat",
"id": "cat"
}]
/**
* 这个类是用来接收,解析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;
}
}
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
}
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容器