控制反转,依赖注入,好莱坞原则
//codepublic?class?Person{?
????public?boolean?makeCall(long?number){?
????????Mobile?mobile=new?Mobile();?
????????return?mobile.dialUp(number);?
????}?
}
也就是说,类Person的makeCall方法对Mobile类具有依赖,必须手动生成一个新的实例new Mobile()才可以进行之后的工作。?
依赖注入的思想是这样,当一个类(Person)对另一个类(Mobile)有依赖时,不再该类(Person)内部对依赖的类(Moblile)进行实例化,而是之前配置一个beans.xml,告诉容器所依赖的类(Mobile),在实例化该类(Person)时,容器自动注入一个所依赖的类(Mobile)的实例。?
接口
Person类:
在xml文件中配置依赖关系
这样,Person类在实现拨打电话的时候,并不知道Mobile类的存在,它只知道调用一个接口MobileInterface,而MobileInterface的具体实现是通过Mobile类完成,并在使用时由容器自动注入,这样大大降低了不同类间相互依赖的关系。
什么叫控制反转呢??
套用好莱坞的一句名言就是:你呆着别动,到时我会找你。?
什么意思呢?就好比一个皇帝和太监?
有一天皇帝想幸某个美女,于是跟太监说,今夜我要宠幸美女?
皇帝往往不会告诉太监,今晚几点会回宫,会回哪张龙床,他只会告诉太监他要哪位美女?
其它一切都交由太监去安排,到了晚上皇帝回宫时,自然会有美女出现在皇帝的龙床上?
这就是控制反转,而把美女送到皇帝的寝宫里面去就是注射?
太监就是是框架里面的注射控制器类BeanFactory,负责找到美女并送到龙床上去?
整个后宫可以看成是Spring框架,美女就是Spring控制下的JavaBean?
而传统的模式就是一个饥渴男去找小姐出台?
找领班,帮助给介绍一个云云,于是领班就开始给他张罗?
介绍一个合适的给他,完事后,再把小姐还给领班,下次再来?
这个过程中,领班就是查询上下文Context,领班的一个职能就是给客户找到他们所要的小姐?
这就是lookup()方法,领班手中的小姐名录就是JNDI//Java Naming and Directory Interface?
小姐就是EJB,饥渴男是客户端,青楼是EJB容器?
看到区别了么?饥渴男去找小姐出台很麻烦,不仅得找,用完后还得把小姐给还回去?
而皇帝爽翻了,什么都不用管,交给太监去处理,控制权转移到太监手中去了?
而不是皇帝,必要时候由太监给注射进去就可以了?
看到Spring的美妙了吧,Spring还提供了与多个主流框架的支持?
可以和其它开源框架集成?