IOC:
IOC也叫做控制反转。
概念:解决了类与类之间的依赖关系(耦合),对象不用由我们手动创建,是由 spring 容器来完成创建,
并维护对象与对象之间的关系。
控制反转:也就是依赖注入,给类中的属性赋值,由原来的类中完成,转移到 spring 工厂中完成。
在Java开发中,设计好的类在内部控制,导致代码冗余,对象与对象之间耦合在一起。
IOC时是将你设计好的类交给 spring容器 来控制,而不是在内部去控制,称之为控制反转
IOC中的 DI(依赖注入)
DI就是三种注入方式:
设值注入:set方法实现 使用<property name="对象中的属性" value="为该属性赋值" />
构造注入:调用指定参数的构造方法实现 使用<constructor-arg index="指定索引" type="指定类型" />
自动装配:set方法实现 需要使用bean标签的属性 autowire="byName / byType" 来完成
byName:类中的属性名跟 spring容器创建对象的名字(bean标签的id)一样,就执行自动状配
byType:spring容器创建的对象,跟类中的属性类型一致,就执行自动装配
如果由多个类型一致的对象,就会报异常。
自动装配
对象创建的次数 和 对象的生命周期
创建对象的次数
Spring 对象创建的次数由 <bean> 标签的 scope 属性控制
scope 属性值: scope是一个默认值,值是 singleton
- singleton 单例 (单态) 整个项目运行期间只创建一个对象
( 一些使用场景:sqlSessionFactory / service / dao)
- prototype 非单例 每次使用都会创建一个新的对象 (一些使用场景: action / sqlsession )
- request 一起请求就创建一个新的对象 Web项目中使用
- session 一次会话就创建一个新的对象 Web项目中使用
对象生命的周期
创建时机:
- 单列对象,加载配置文件的时候,创建一次
- 非单例对象,每使用一次,就创建一次
销毁:
- 当工厂关闭的时候,销毁对象
工厂关闭:工厂里面有一个 close() 方法,调用改方法就是关闭工厂。
DI(依赖注入)的使用
设值注入: <property />
<bean id="xxx" class="类全路径">
基本数据类型的注入
<property name="类中的属性" value="值" /> 自闭和
<property name="类中的属性">
<value>值</value>
</property>
集合/数组类型属性赋值
<property name="list">
<list>
<value>值</value>
</list>
</property>
set集合属性赋值
<property name="set">
<set>
<value> 需要赋的值</value>
</set>
</property>
map集合属性赋值
<property name="map">
<map>
<entry key="键" value="值"></entry>
</map>
</property>
自定义属性赋值
<property name="obj">
<property name="books" ref="book" />
</property>
集合是泛型是自定义的属性赋值
<property name="b_list">
<list>
<ref <ref bean="引用bean标签的 id"/> />
<ref <ref bean="引用bean标签的 id"/> />
</list>
<!-- Map给自定义类型赋值是 -->
<map>
<entry key="键" value-ref="值"></entry>
</map>
</property>
给 properties 类型属性赋值
<property name="b_properties">
<props>
<prop key="CN">中国</prop>
</props>
</property>
</bean>
构造注入 <constructor-arg index="该值对应的参数的索引" type="类型全类名">
bean id="classifySV" class="com.service.impl.ClassifySVImpl">
给 单个基本类型参数 的构造方法赋值
<constructor-arg index="该值对应的参数的所以" type="类型全类名">
<value>xxx</value>
</constructor-arg>
给 多个基本类型参数 的构造方法赋值
<constructor-arg index="该值对应的参数的所以" type="类型全类名">
<value>xxx</value>
</constructor-arg>
<constructor-arg index="该值对应的参数的所以" type="类型全类名">
<value>xxx</value>
</constructor-arg>
给 自定义类型参数 的构造方法赋值
<constructor-arg index="该值对应的参数的所以" type="类型全类名">
<ref bean="classifyDAO"/> <!--引用一个对象-->
</constructor-arg>
</bean>