1、基本定义
IOC是一种叫做“控制反转”的设计思想。
A、较浅的层次——从名字上解析
“控制”就是指对 对象的创建、维护、销毁等生命周期的控制,这个过程一般是由我们的程序去主动控制的,如使用new关键字去创建一个对象(创建),在使用过程中保持引用(维护),在失去全部引用后由GC去回收对象(销毁)。
“反转”就是指对 对象的创建、维护、销毁等生命周期的控制由程序控制改为由IOC容器控制,需要某个对象时就直接通过名字去IOC容器中获取。
B、更深的层次——提到DI,依赖注入,是IOC的一种重要实现
一个对象的创建往往会涉及到其他对象的创建,比如一个对象A的成员变量持有着另一个对象B的引用,这就是依赖,A依赖于B。IOC机制既然负责了对象的创建,那么这个依赖关系也就必须由IOC容器负责起来。负责的方式就是DI——依赖注入,通过将依赖关系写入配置文件,然后在创建有依赖关系的对象时,由IOC容器注入依赖的对象,如在创建A时,检查到有依赖关系,IOC容器就把A依赖的对象B创建后注入到A中(组装,通过反射机制实现),然后把A返回给对象请求者,完成工作。依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
C、IOC的意义何在?
IOC并没有实现更多的功能,但它的存在使我们不需要很多代码、不需要考虑对象间复杂的耦合关系就能从IOC容器中获取合适的对象,而且提供了对 对象的可靠的管理,极大地降低了开发的复杂性。
2、原理
面向对象的时候
A.依赖
Class A{
}
Class B{
public void xxx(A a){
}
}
B.继承:is a
Class A{
}
Class B extends A{
}
C.聚合:has a
3 Spring的工厂类
3.1 BeanFactory :老版本的工厂类
BeanFactory:调用getBean的时候,才会生成类的实例
。
3.2 ApplicationContext:新版本的工厂类
ApplicationContext:加载配置文件的时候,就会将Spring管理的类都实例化
。
ApplicationContext有两个实现类:
ClassPathXmlApplicationContext :
加载类路径下的配置文件FileSystemXmlApplicationContext :
加载文件系统下的配置文件
4 Spring的配置
4.1 Schema的配置
4.2 Bean的相关的配置
4.2.1 <bean>
标签的id和name的配置
id
:使用了约束中的唯一约束。里面不能出现特殊字符的。name
:没有使用约束中的唯一约束(理论上可以出现重复的,但是实际开发不能出现的)。里面可以出现特殊字符。
4..2.2 Bean的作用范围的配置(重点)
scope :Bean的作用范围
singleton
:默认的,Spring会采用单例模式创建这个对象。
prototype
:多例模式。(Struts2和Spring整合一定会用到)request
:应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。session
:应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。globalsession
:应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
5 Spring的Bean管理(XML方式)
5.1 Spring的Bean的实例化方式(了解)
Bean已经都交给Spring管理,Spring创建这些类的时候,有几种方式:
5.1.1 无参构造方法的方式(默认)
5.1.2 静态工厂实例化的方式
5.1.3 实例工厂实例化的方式
配置
:
5.2 Spring 的 的 Bean 的属性注入:
【构造方法的方式注入属性】
<!-- 第一种:构造方法的方式 -->
<bean id="car" class="com.bean.Car">
<constructor-arg name="name" value="宝马"></constructor-arg>
<constructor-arg name="price" value="1000"></constructor-arg>
</bean>
【set 方法的方式注入属性】
<!-- 第二种:set 方法的方式 -->
<bean id="car" class="com.bean.Car">
<property name="name" value="保时捷"></property>
<property name="price" value="2000000"></property>
</bean>
5.3 Spring 的属性注入:对象类型的注入
<!-- 注入对象类型的属性 -->
<bean id="person" class="com.bean.Person">
<property name="name" value="tracydzf"></property>
<property name="age" value="18"></property>
<property name="car" ref="car"></property>
</bean>
5.4名称空间 p 的属性注入的方式:Spring2.x 版本后提供的方式
<!-- p 名称空间的属性注入的方式 -->
<bean id="car" class="com.bean.Car" p:name="兰博基尼" p:price="9999999999"/>
<bean id="person" class="com.bean.Person" p:name="tracydzf" p:age="18" p:car-ref="car"/>
5.5注入复杂类型:
<!-- Spring 的复杂类型的注入===================== -->
<bean id="collectionBean" class="cn.itcast.spring.demo5.CollectionBean">
<!-- 数组类型的属性 -->
<property name="arrs">
<list>
<value>会希</value>
<value>冠希</value>
<value>天一</value>
</list>
</property>
<!-- 注入 List 集合的数据 -->
<property name="list">
<list>
<value>芙蓉</value>
<value>如花</value>
<value>凤姐</value>
</list>
</property>
<!-- 注入 Map 集合 -->
<property name="map">
<map>
<entry key="aaa" value="111"/>
<entry key="bbb" value="222"/>
<entry key="ccc" value="333"/>
</map>
</property>
<!-- Properties 的注入 -->
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">123</prop>
</props>
</property>
</bean>
5.7Spring 的分配置文件的开发
一种:创建工厂的时候加载多个配置文件:
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml","applicationContext2.xml");
二种:在一个配置文件中包含另一个配置文件:
<import resource="applicationContext2.xml"></import>