您的位置:首页 > 其它

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

2016-05-18 21:57 351 查看
眨眼又是一天过去了!!!今天,我们将继续讨论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、费尽千辛万苦,就为了做个单例模式?完全可以用其它方法来实现,为什么要这样做呢?

但本人经验水平有限… …暂不能知道为啥,后面我会再深入学习,多思考,得到新心得后,再分享出来给大家。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  框架 ioc dhroid框架