IoC容器:02.实现一个简单的IoC容器

63 阅读1分钟

自己来实现一个简单的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);
    }
}