Spring基础篇-自定义一个IoC容器

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);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值