技术描写叙述
Class A中用到了Class B的对象b。普通情况下。须要在A的代码中显式的new一个B的对象。
採用依赖注入技术之后,A的代码仅仅须要定义一个私有的B对象,不须要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。
而详细获取的方法、对象被获取时的状态由配置文件(如XML)来指定。
实现方法
实现控制反转主要有两种方式:依赖注入和依赖查找。两者的差别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来推断将不同的对象注入到不同的属性中,而后者是主动索取响应名称的对象,获得依赖对象的时间也能够在代码中自由控制。
依赖注入有例如以下实现方式:
基于接口。实现特定接口以供外部容器注入所依赖类型的对象。
基于 set 方法。
实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。
基于构造函数。
实现特定參数的构造函数。在新建对象时传入所依赖类型的对象。
基于注解。基于Java的注解功能。在私有变量前加“@Autowired”等注解。不须要显式的定义以上三种代码,便能够让外部容器传入相应的对象。该方案相当于定义了public的set方法。可是由于没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(由于set方法仅仅想让容器訪问来注入而并不希望其它依赖此类的对象訪问)。
Android学习进阶和IoC
1.成为Android高手一般分为六个阶段:
第一阶段:熟练掌握Java SE,尤其是对其内部类、线程、并发、网络编程等须要深入研究;熟练掌握基于HTTP协议的编程,清楚POST和GET等请求方式流程和细节;可以进行主要的Java Web编程,假设可以使用Java EE则更好。
第二阶段:精通Android的核心API的使用,比如四大组件所涉及的API、Context等,精通核心界面的编程。比如ListView的编程;到达这个阶段已经可以做大部分主要的应用开发了。
第三阶段:精通应用框架的原理,尤其是对IoC的理解及其在Android应用框架中的应用,精通主要的23种设计模式在Android中的应用;
第四阶段:精通JNI,熟练Android类库中C/C++组件开发。并可以使用JNI机制把现有的C/C++组件移植成为应用框架的核心组件;具备改动和编写自己的应用框架的能力;
第五阶段:做出自己的Android系统。不管是底层还是上层都可以了如指掌;可以依据实际须要设计和实现比較大Android系统。比如带领比較大的团队做出自己的Android手机产品等。
第六阶段:势。一切的思考均进入“势”的思考,一切都是思路问题,推断和预測Android的形势,引领市场,通往自由的天堂。
2. Android之IoC (Inversion of Control)
1)概念
一种设计思想。
使调用者和被调用者解耦和分离,便于更改和代码重用,便于移植。
很多应用都是由多个类通过彼此合作来实现业务逻辑,每一个对象之间都相互依赖,这将导致代码高度耦合而且难以測试、难以改动难以重用。
IoC非常好的攻克了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在执行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部容器来完毕。
2)案例
为了实现调用者和被调用者解耦,分离。通常是通过工厂模式实现的,以下将通过比較工厂模式和Ioc模式不同。加深理解Ioc模式。
如果有两个类B 和 C:B作为调用者。C是被调用者。
一般的做法是:
public class B{
private C comp=new C();
......
}
工厂模式实现例如以下:
public class B{
private C comp;
private final static MyFactory myFactory = MyFactory.getInstance();
public B(){
this.comp = myFactory.createInstanceOfC();
}
public void someMethod(){
this.comp.sayHello();
}
}
使用Ioc依赖性注射实现Picocontainer例如以下:
public class B{
private C comp;
public B(C comp){
this.comp = comp;
}
public void someMethod(){
this.comp.sayHello();
}
}
//外部容器实现。控制程序间的关系。
CImp类为C接口/类的一个详细实现。
public class client{
public static void main( String[] args ) {
DefaultPicoContainer container = new DefaultPicoContainer();
container.registerComponentImplementation(CImp.class); //向B类实现注射C类详细实现
container.registerComponentImplementation(B.class);
B b = (B) container.getComponentInstance(B.class);
b.someMethod();
}
}
3)工厂模式和Ioc不同的特点和差别:
如上,主要差别体如今B类的代码,假设使用Ioc,在B类代码中将不须要嵌入不论什么工厂模式等的代码。由于这些工厂模式事实上还是与C有些间接的联系,这样,使用Ioc彻底解耦了B和C之间的联系。
使用Ioc带来的代价是:须要在client或其他某处进行B和C之间联系的组装。
所以,Ioc并没有消除B和C之间这种联系。仅仅是转移了这种联系。
总之,使用Ioc模式,能够无论将来详细实现,全然在一个抽象层次进行描写叙述和技术架构。
http://blog.csdn.net/blog_wang/article/details/38468547 //注解绑定UI
http://blog.csdn.net/lindir/article/details/7843109
http://blog.csdn.net/zhaokaiqiang1992/article/details/37929071
http://www.cnblogs.com/devinzhang/p/3862942.html //依赖注入和控制反转
版权声明:本文博主原创文章,博客,未经同意不得转载。