Spring(IOC&DI)

本文详细解释了IOC(控制反转)和DI(依赖注入)的概念,探讨了它们如何解决开发中类之间的耦合问题,特别是在Spring框架中的应用。介绍了工厂模式解耦、IOC思想、依赖注入的不同方式,如set方法注入、构造方法注入、字段注入等。
首先为什么会有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 将类的依 赖的属性设置进去.

  • 注入方式
  1. set方法注入
  2. 构造方法注入
  3. 字段注入
  • 注入类型
  1. 值类型注入(基本八大类型)

  2. 引用类型注入(将依赖对象注入)

  3. 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属性.==

  1. 构造函数注入

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;
	}
复制代码
  1. 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>
复制代码
  1. 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,跟之前的引用类型用法一样

  1. 复杂类型注入

数组,集合,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>
复制代码

转载于:https://juejin.im/post/5b7545d85188257a700bd3c8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值