Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
IoC也称为好莱坞原则(Hollywood Principle):“Don’t call us, we’ll call you”。即,如果大腕明星想演节目,不用自己去找好莱坞公司,而是由好莱坞公司主动去找他们(当然,之前这些明星必须要在好莱坞登记过)。
正在业界为IoC争吵不休时,大师级人物Martin Fowler也站出来发话,以一篇经典文章《Inversion of Control Containers and the Dependency Injection pattern》为IoC正名,至此,IoC又获得了一个新的名字:“依赖注入 (Dependency Injection)”。
相对IoC 而言,“依赖注入”的确更加准确的描述了这种古老而又时兴的设计理念。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
依赖注入机制减轻了组件之间的依赖关系,同时也大大提高了组件的可移植性,这意味着,组件得到重用的机会将会更多。
依赖注入的三种实现形式
Type1-接口注入(Interface Injection)
Type2-设值方法注入(Setter Injection)
Type3-构造注入(Constructor Injection)
bean 的作用域
singleton:返回bean 的同一个实例也是默认的作用域无状态bean 使用此作用域
prototype:每次请求都会创建一个实例有状态bean 使用此作用域
request、session、global session 这三个作用域主要用在web 应用中
bean 的生命周期
(1)什么时候初始化bean 实例 当scopesingleton即默认情况会在装载配置文件时实例化。如果希望在调用getBean 时才初始化可以使用lazy-init="true" 补充如果希望希望该配置文件中的所有bean 都延迟初始化则应在beans 根结点中使用lazy-init="true"。 当scope=prototype 时在调用getBean()方法时才会初始化。
只有singleton行为的bean接受容器管理生命周期。