IOC 概念介绍
IOC(控制反转)不是什么技术,而是一种设计思想。它的目的是指导我们设计出更加松耦合的程序。
控制: 指的是控制权,在java中可以简单理解为 对象的控制权限(比如对象的创建、销毁等权限)
反转: 指的是将对象的控制权由原来的 程序员在类中主动控制 反转到 由Spring容器来控制。
Bean的懒加载
单例情况下,默认 lazy = false ,也就是容器创建,对象创建;true:第一次获取对象时才创建对象
Bean的作用域
Bean的作用域是指Spring给我们创建出的对象的存活范围(存活周期)。
可以在spring配置文件中通过bean标签中的scope属性来对当前bean对象的作用域进行指定。 scope属性有五个取值:
- singleton(默认) 创建出的实例为单例模式, IOC只创建一次,然后一直存在
- prototype 创建出的实例为多例模式, 每次获取bean的时候,IOC都给我们重新创建新对象
- request(web) web项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
- session (web) web项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
- globalSession (用于分布式web开发) 创建的实例绑定全局session对象
Bean的生命周期
Bean对象生命周期指的是Bean创建到销毁的这么一段时间。
spring配置文件中通过bean标签中的
init-method属性:指定bean对象创建之后调用的方法
destroy-method: 指定容器销毁之前调用的方法
Spring中单例对象的生命周期:
- 出生:IOC容器加载时出生
- 存活:IOC容器存活(没销毁)时存活
- 销毁:IOC容器销毁之前销毁
Spring中多例对象的生命周期:
- 出生:每次getBean()都会创建对象,然后执行init()方法
- 存活:一直存活
- 销毁:不受IOC容器管控,由Java垃圾回收器负责销毁
依赖注入
依赖注入(Dependency Injection,DI) 其实就是给对象中的属性赋值。
使用构造函数注入属性值
<!--构造函数注入属性值 <constructor-arg> -->
<!--
给哪个构造函数的参数赋值:
name: 构造函数的参数名
index: 构造函数中参数的位置,从0开始
构造函数的参数赋值
value: 简单类型赋值, 基本类型+包装类型+String
ref: 引用类型赋值,值是其他bean的ID -->
<bean id="account" class="com.eponine.spring.domain.Account">
<constructor-arg name="id" value=""></constructor-arg>
<constructor-arg name="name" value="hawk"></constructor-arg>
<constructor-arg name="balance" value="10000"></constructor-arg>
</bean>
使用set方法给属性赋值
<!--使用set方法进行属性注入-->
<!--
property:
给哪个方法穿参:name -> 去掉set之后的方法的名称,不是以set开头的方法不会被识别
传递的参数值:
value: 简单类型值
ref: 引用类型值,值是容器中其他bean的ID
-->
<bean id="accountService" class="com.eponine.spring.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
</bean>
p名称空间
前提条件:xml头部引入p名称空间约束 xmlns:p="www.springframework.org/schema/p"
<!--:p名称空间
1. 需要配置:p名称空间的约束 xmlns:p="http://www.springframework.org/schema/p"
2. 每个属性有2个选项:
属性名称 (给普通属性赋值)
属性名称-ref(给特殊类型-bean类型的属性赋值)
-->
<bean id="account" class="com.eponine.spring.domain.Account"
p:id=""
p:name="hawk"
p:balance="10000">
</bean>
注入集合属性
就是给类中的集合成员传值,它用的也是 set方法注入的方式,只不过变量的数据类型都是集合。
<bean id="book" class="com.eponine.spring.domain.Book">
<property name="myArr">
<array>
<value>1</value>
<value>1</value>
</array>
</property>
<property name="myList">
<list>
<ref bean="account"></ref>
<ref bean="account"></ref>
</list>
</property>
<property name="myMap">
<map>
<entry key="a1" value-ref="account"></entry>
<entry key="a2" value-ref="account"></entry>
</map>
</property>
<property name="mySet">
<set>
<value>1</value>
<value>2</value>
</set>
</property>
<property name="properties">
<props>
<prop key="p1">1</prop>
<prop key="p2">2</prop>
</props>
</property>
</bean>
配置文件模块化
- 并列引入:分多个文件配置,创建容器时指定多个配置文件
- 主从引入:分多个文件配置,由一个主配置文件引入其他所有配置文件,创建容器时指定主配置文件
<import resource="applicationContext.xml"></import>
注意:
同一个xml文件中不能出现ID相同名称的bean,如果出现会报错
多个xml文件如果出现ID相同名称的bean,不会报错,但是后加载的会覆盖前加载的bean