IOC与反射

反射

反射听起来高大上,其实就可以理解为:通过类的路径(就是个字符串)来new一个类:
在这里插入图片描述

IOC

依赖注入,依赖注入的好处就是:如果你的程序中new一个类是需要动态new的,那么得到这个需要new的类的名称之后,就可以动态new出来。
我理解IOC就像工厂方法+反射动态生成对象。
举个例子:
假设有这些类

    class food{
        
    }
    
    class apple extends food{
        void eat(){
            System.out.println("apple");
        }
    }
    
    class banana extends food{
        void eat(){
            System.out.println("banana");
        }
    }

我们程序中会动态生成今天吃的食物的名称是apple还是banana,如果是apple就要求返回一个apple对象,如果想吃banana就要求返回一个banana对象。为了应对这种需求,我们可以写出一个工厂类:

    class Factory{
        food getFood(String name){
            if (name.equals("apple")){
                return new apple();
            } else if (name.equals("banana")){
                return new banana();
            }
            return null;
        }
    }

但是这样写有个麻烦,假设我们的菜谱上又加上一个类:

    class potato extends food{
        void eat(){
            System.out.println("potato");
        }
    }

那么为了适应这种变化,我们就要去更改工厂类,所以我们要通过反射来实现我们的工厂类:

    class Factory{
        Class<?> getFood(String name) throws ClassNotFoundException {
            return Class.forName(name);
        }
    }

这样无论以后增加什么菜谱,我们都不需要更改工厂类,我们只需要传过来新菜品的名字就能new新菜品。

IOC就是这个道理,我们先将每个POJO注册到bean容器中,(bean容器可以理解成一个哈希表,key是bean的名字,value是名字对应的实体类)当我们程序中需要动态new一个类的时候,我们只需要用这个类的名字到bean容器中去获得名字对应的实体类就可以,这样的好处是:
程序中可以动态的获取对象,比方说每天的菜品是变化的,当我们获得一个菜品的名字字符串的时候,如果不使用IOC,那么我们就很难new一个对象。而且使用bean容器管理对象也很简单。


应用

所以知道了这些,我们就可以理解spring IOC的实现原理了。在spring中,我们只需要写一个xml文件就可以实现自动注入,比如

<bean id="bookdao" class="dao.BookDao"></bean>

这实际上的过程是:
spring通过字符串解析,解析到我们想要new一个名为bookdao的对象,他的实例是dao.BookDao,所以spring通过反射创建dao.BookDao对象,并将其放入bean容器中(可以理解bean容器是一个哈希表,key是bookdao,value是dao.BookDao实例).

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canaryW

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值