首先为什么会有IOC(Inverse of Control)?
在开发中,会写很多的类,而有些类之间不可避免的产生依赖关系,这种依赖关系称之为耦合.
例如:service层必须依赖dao层
public class CustomerService {
private CustomerDao dao = new CustomerDao();
}
复制代码
解决这个问题,可以使用配置文件配置.
所以就引出了工厂模式解耦.
什么是工厂模式解耦?
就是把所有需要使用到对象,使用配置文件配置.在服务器启动的时候进行加载.通过读取配置文件,将配置文件中的对象存放起来,当需要使用的时候,拿出来使用.于是就引出了IOC思想了.
控制反转-Inverse of Control
由于我们需要将配置文件的对象存放起来,所以我们需要使用集合来做存放对象的容器.因此我们要在应用加载的时候,创建一个Map,并将我们所需要的对象存放起来.工厂就是负责从这个容器中获取我们指定对象的容器.
所以IOC就是将我们创建对象的方式反转了,以前创建对象是由开发人员主动执行的,包括依赖关系也是.==但是我们使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入.反转控制就是反转了我们创建对象的方式,从我们自己创建反转给了spring创建
对象的创建权反转(交给)给 Spring.作用是实现了程序的解耦合.
DI(Dependency Injection)依赖注入
实现IOC思想需要DI的支持
需要有 IOC 的环境,Spring 创建这个类的过程中,Spring 将类的依 赖的属性设置进去.
- 注入方式
- set方法注入
- 构造方法注入
- 字段注入
- 注入类型
-
值类型注入(基本八大类型)
-
引用类型注入(将依赖对象注入)
-
set方式注入
- 属性注入
<bean name="user" class="com.demo.pojo.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
</bean>
复制代码
- 对象注入
<bean name="user" class="com.demo.pojo.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
<property name="Car" ref="car"></property>
</bean>
<bean name="car" class="com.demo.pojo.Car">
<property name="name" value="AE86"></property>
<property name="color" value="白色"></property>
</bean>
复制代码
==注意:值类型使用value属性,引用类型使用ref属性.==
- 构造函数注入
constructor-arg元素
属性 | 详解 |
---|---|
name | 对象的属性名 |
value | 值 |
ref | 引用什么对象 |
index | 构造函数的参数列表的顺序 |
type | 构造函数的参数类型. |
<bean name="user" class="com.demo.pojo.User">
<constructor-arg name="name" value="666" index="1" type="java.lang.Integer"></constructor-arg>
<constructor-arg name="car" ref="car" index="0"></constructor-arg>
</bean>
//构造方法
public User(String name, Car car) {
this.name = name;
this.car = car;
}
public User(Car car, Integer name) {
this.name = name+"";
this.car = car;
}
复制代码
- p名称空间注入
前置工作:需要导入p命名空间
在根元素中添加以下的这段代码
xmlns:p="http://www.springframework.org/schema/p"
复制代码
其实就是set注入方法
<bean name="user2" class="com.demo.pojo.User" p:name="tom"
p:age="18" p:car-ref="car"></bean>
复制代码
- spel 注入
<!-- spring expression language -->
<bean name="user3" class="com.demo.pojo.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user1.age}"></property>
<property name="car" ref="car"></property>
</bean>
复制代码
注意:引用类型不能使用spel,跟之前的引用类型用法一样
- 复杂类型注入
数组,集合,Map集合,Properties
注意:数据与集合当值只有一个的时候,值可以写在property元素中的value属性中
<property name="arr" value="tom"></property>
<property name="list" value="jerry"></property>
复制代码
<bean name="cb" class="com.demo.pojo.CollectionBean">
<property name="arr">
<array>
<value>tom</value>
<value>jerry</value>
<ref bean="car"/>
</array>
</property>
<property name="list">
<list>
<value>#{user.name}</value>
<value>#{user.age}</value>
<ref bean="car"/>
</list>
</property>
<property name="map">
<map>
<entry key="name" value="mama"></entry>
<entry key="uu" value-ref="user2"></entry>
<entry key-ref="user2" value-ref="user3"></entry>
</map>
</property>
<property name="prop">
<props>
<prop key="name">tom</prop>
<prop key="age">18</prop>
</props>
</property>
</bean>
复制代码