自己来实现一个简单的IoC容器。
首先,定义一个beans.json文件,这个文件的作用类似于Spring中的XML配置文件,beans.json文件内容如下:
[{"clazz": "org.example.Dog","id": "dog"}]
然后定义Dog实体类,将来通过反射创建出Dog对象:
package org.example;
/**
* @author Administrator
*/
public class Dog {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
}
创建BeanDefintion来接收解析出来的JSON值
package org.example;
public class BeanDefintion {
private String clazz;
private String id;
public String getClazz() {
return clazz;
}
public void setClazz(String clazz) {
this.clazz = clazz;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
最后,在项目启动中,将反射出来的对象,添加到容器中
package org.example;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//初始化容器
Map<String,Object> container = new HashMap<>();
//解析json值
ObjectMapper om = new ObjectMapper();
List<BeanDefintion> beanDefintions = om.readValue(Main.class.getResourceAsStream("/beans.json"), new TypeReference<List<BeanDefintion>>() {
});
//将解析出来的对象,添加到container容器中
for (BeanDefintion beanDefintion : beanDefintions) {
String id = beanDefintion.getId();
String clazz = beanDefintion.getClazz();
Object instance = Class.forName(clazz).getConstructor().newInstance();
container.put("dog",instance);
}
//使用对象
Dog dog = (Dog)container.get("dog");
System.out.println("dog = " + dog);
}
}