IOC/DI简介:
DI为依赖注入,通常来说bean是自己控制对象的实例化等工作(即依赖关系)。但在Spring容器中,创建bean的同时完成了注入依赖关系的工作。
IOC为控制反转,其与DI的意义类似,即本来bean自己控制实例化,现在成了创建bean时便完成了实例化等依赖工作,所以称为控制反转。
”依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of Control, IoC) 名字的由来。
应用DI原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系(甚至不知道依赖的定义指定地方和依赖的实际类)之后,实现更高层次的松耦合将易如反掌。DI主要有两种注入方式,即Setter注入和构造器注入。”
——Spring Preference原文
spring配置文件:context.xml:
在beans.xml标签中,<bean>即意味着new一个该class的新对象,而<ref>(包括<ref bean = "" />)即引用已存在的一个对象。
注入方式有setter注入与构造器注入,如果具体bean对应class内部写的是构造函数的话,就使用构造器注入;如果class内部写的是setter, getter,就使用setter注入。后者常用一些。
构造器注入利用<constructor-arg>标签。可以通过定arg的type或者index确认哪个bean是作为哪个参数存在。
setter注入利用<property>标签。【常用】
上述两个都写在<bean>标签辖内。
<bean>标签详解:
<bean>有范围属性,用scope属性指定。scope为singleton时,每次getbean拿到是同一个bean;为prototype时,每次getbean都获得一个新的bean。
<bean>可以自动装配,即不用<property>,而用autowire属性指定。byName用xml文件中被装配的<bean>的name字段,匹配本bean对应类中装配属性的名称;byType用xml中被装配的<bean>的class字段,匹配本bean对应类中属性的类型。
<bean>有生存周期,初试时间用lazy-init指定,结束时间与Context结束时间相同。相关地,有init-method, destroy-method属性指定。后两者需要在对应的实体类中添加方法以对应。【后两者不可以与prototype类型的<bean>同用,因为容器销毁时不监控Prototype类型的bean,生成时,每个prototype类型的bean都会调用一次init-method。】
1. lazy-init为true时,在Context(容器)生成时不实例化,直到getbean时才实例化。为false时(默认),容器生成时即实例化。
2. init-method用于指定初始化函数。
3. destroy-method用于指定销毁函数。