Dhroid框架六大组件之Ioc容器【下】

眨眼又是一天过去了!!!今天,我们将继续讨论Ioc容器的剩余部分,先从上篇未讲完的get方法,开始解剖!

    //get方法的具体实现
    public <T> T get(Class<T> clazz) {
        T t = getSysService(clazz);
        if (t != null)
            return t;
        Instance instance = instanceByClazz.get(clazz);
        if (instance != null) {
            return (T) instance.get(getApplicationContext());
            // 接口过滤
        } else if (!clazz.isInterface()) {
            bind(clazz).to(clazz).scope(InstanceScope.SCOPE_SINGLETON);
            Instance newins = instanceByClazz.get(clazz);
            if (newins != null) {
                return (T) newins.get(getApplicationContext());
            }
        }
        return null;
    }
    //获取一些常见类的对象
    public <T> T getSysService(Class<T> clazz) {
        T t = null;
        if (clazz == NotificationManager.class) {
            t = (T) getApplicationContext().getSystemService(
                    Context.NOTIFICATION_SERVICE);
        } else if (clazz == ActivityManager.class) {
            t = (T) getApplicationContext().getSystemService(
                    Context.ACTIVITY_SERVICE);
        } else if (clazz == PackageManager.class) {
            t = (T) getApplicationContext().getPackageManager();
        } else if (clazz == AssetManager.class) {
            t = (T) getApplicationContext().getAssets();
        }
        return t;
    }

由代码可知,getSysService方法是用于获取一些常见类的对象,而这些类本身就是单例模式,如果需要获取的类对象不是常见的单例类。那么,就返回一个null值。然后,下一步继续判断,如果这个类本身是常见的单例类,就直接返回到get方法,get方法就再将这个对象继续往上层返回。如果是null,那就通过map类型的instanceByClazz来获取一个叫instance的实例,如果map类型里,有存放这个类对象,就直接返回。如果没有,就再判断这个类是不是接口类型,如果是,那get就返回个null。。因为,实现无法找到或创建一个类对象。如果这个类不是接口类型,那就将这个类捆绑到map容器里,然后生成一个对象。。这个地方,就帮我们做了,我们在上篇用大篇幅介绍的几个方法:

bind(clazz).to(clazz).scope(InstanceScope.SCOPE_SINGLETON);

好了,到此为止,Ioc容器的源码就剖析完毕了!

但对于Ioc容器的学习,并不意味着到此结束,因为我们还有几个问题没有解疑:
1、Instance类的剩余代码,还有啥作用?(虽然主功能,已被我们解析完)
2、框架设计者,为何要做这个东西?这样做的好处又是啥?
3、费尽千辛万苦,就为了做个单例模式?完全可以用其它方法来实现,为什么要这样做呢?

但本人经验水平有限… …暂不能知道为啥,后面我会再深入学习,多思考,得到新心得后,再分享出来给大家。

Elite Container是DELPHI下的一个轻量级IoC对象容器IoC:Inverse of Control,反转控制)。它是参考了Java中的Spring框架(主要是配置文件的写法),并结合DELPHI的特点来构建的。相比Spring的对象容器,它提供的功能更为精简常用(如对象延迟创建、对象属性自动注入等),降低了学习的难度,并且提供了很多扩展点,你只需简单地写一个插件实现类,并在配置文件中进行简单配置,就可以让Elite Container拥有你的自定义功能! 借助Elite Container和Ioc思想,你可以更轻易地构建出具有松散耦合、重用度高的应用程序。它的核心思想就是拆分功能的接口和实现,上层只依赖于下层的接口,然后通过Elite Container的配置,把不同的实现类注入到该接口中,达到更换功能,也就是复用已有代码的目的。设计人员可以真正地发挥好自己的面向对象思想和相关设计模式,来架构企业级的应用程序,而无需象以前那样,在Delphi中用起面向对象总有点捉襟见袖的感觉。 ps. 由于写程序,还有精心准备的26个例子,都花费了我很多的时间,所以象征性地收2个资源分,希望大家不会介意:) ps2. 说明一下,开发出来的程序在发布的时候,除了发布EliteCore.bpl、EliteContainer.bpl外,还需要发布rtl.bpl(EliteCore.bpl引用到了它)。由于一时疏忽,例子中的Bin目录里忘记带上它了,请大家注意,谢谢~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值