先说说什么是耦合关系
上面的齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。
控制反转(IOC)
如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一,所以为了优化这个问题,软件专家Michael Mattson提出了IOC概念,用来实现对象之间的“解耦”,现在这个理论被运用得很广泛,很多J2EE项目均采用了IOC框架产品Spring。
概念
IOC是Inversion of Control的缩写—>控制反转。
简单来说,IOC就是将复杂系统分解成相互合作的对象,这些对象通过封装,内部实现对外部是透明的,可以被灵活地被重用和扩展,
IOC理论提出的观点大体是,借助于“第三方”实现具有依赖关系的对象之间的解耦,对象ABCD将控制权交给IOC容器,相当于由主动获取对象,变成被动接受对象,这也是控制反转的由来。
Spring的核心机制–依赖注入
控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度,其中最常见的实现方式是依赖注入,还有一种是依赖查找。
依赖注入:让调用类对某一接口实现类的依赖关系由第三方(容器或者协作类)注入。
通常有的方式:
1、属性注入:IOC容器使用属性的Setter方法来注入被依赖的实例。
<!-- set注入,通过value
value表示值类型的注入,ref表示对象类型的注入-->
<bean name="car" class="com.spring.entity.Car" lazy-init="true">
<property name="name" value="AE86"></property>
<property name="color" value="red"></property>
</bean>
<bean name="injectionP1" class="com.spring.entity.Person" lazy-init="true">
<property name="name" value="sansui" ></property>
<property name="age" value="19"></property>
<property name="car" ref="car"></property>
<!-- ref="car"的car对应上面bean的name="car" -->
</bean>
2、构造注入:IOC容器使用构造器来注入被依赖的实例。
<!--构造方法注入-->
<bean name="injectionP2" class="com.spring.entity.Person" lazy-init="true">
<!-- index指定参数的位置,当构造方法有多个就可以用index指定位置 -->
<!-- type属性来区分数据类型 -->
<constructor-arg name="name" value="lxh" index="0" type="java.lang.String"></constructor-arg>
<constructor-arg name="age" value="22"></constructor-arg>
<constructor-arg name="car" ref="car"></constructor-arg>
</bean>
3、P名称空间注入
先在头文件加上xmlns:p…;官方文档里面可以找到
<!-- p名称空间注入
xmlns:p="http://www.springframework.org/schema/p"
https://docs.spring.io/spring/docs/5.2.8.RELEASE/spring-framework-reference/core.html#databuffers
p:属性名 表示值类型
p:属性名-ref 表示引用类型
-->
<bean name="injectionP3" class="com.spring.entity.Person" lazy-init="true"
p:name="testP"
p:age="27"
p:car-ref="car">
</bean>
4、EL表达式注入
<!--EL表达式注入 -->
<bean name="injectionP4" class="com.spring.entity.Person" lazy-init="true">
<property name="name" value="#{injectionP1.name}"></property>
<property name="age" value="#{injectionP1.age}"></property>
<property name="car" ref="car"></property>
</bean>