IoC容器
ioc(Inversion of control),也就是控制反转的意思,基于面向对象的设计原则,为了降低计算机代码的耦合度,常见的实现方式就是依赖注入(DI)。
我们知道,如果在一个类中创建另一个类,通过new进行实例化,则对象的使用权则在当前类中,这样做,对于一些经常修改的模块,以后就会比较难以修改。
使用Spring 容器,则可以避免这个问题,将对象的创建,销毁等操作都交给Spring去管理,从容器中获取类的信息,如,全路径,名称等。
现在,我们来自己实现一个简单的容器。
首先,引入相关的依赖,我这里是以json格式进行读取,所以引入json依赖。
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
</dependencies>
接着,我们创建一个json文件,放在resources下面即可。
[
{"clazz": "com.tongzhou.demo.Cat","id": "cat"}
]
注意,我这里用中括号包起来,意思就是可以注入多个。
紧接着,我们创建一个容器类。
public class BeanDefinition {
private String clazz;
private String id;
//省略get set toString方法
}
最后,定义一个对象,进行注入。
public class Cat {
private String name;
private String age;
//省略 get set toString等方法
}
如此,便可大功告成,进行注入,调用!
public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//创建容器
HashMap<String, Object> beanContainer = new HashMap<>();
ObjectMapper om = new ObjectMapper();
//读取json,并将其转为默认bean
List<BeanDefinition> beanDefinitions = om.readValue(Test.class.getResourceAsStream("/beans.json"), new TypeReference<List<BeanDefinition>>() {
@Override
public Type getType() {
return super.getType();
}
});
//进行封装,将json中的内容注册到容器中
for (BeanDefinition beanDefinition : beanDefinitions) {
String id = beanDefinition.getId();
String clazz = beanDefinition.getClazz();
Object o = Class.forName(clazz).getConstructor().newInstance();
beanContainer.put(id,o);
}
//进行调用
Cat cat = (Cat) beanContainer.get("cat");
System.out.println("cat:"+cat);
}