IoC本质
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。
IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
在之前的博客中就写过,
Hello hello = new Hello();
hello.setName("Spring");
这两句话由beans.xml来实现,个人理解这就是控制反转,也就是说控制对象的创建的程序被反转了,
程序不用来创建对象,只用来接收对象,对象现在是由Spring创建的。
依赖注入 : 利用set方法来进行注入。
通过无参构造方法来创建对象时,先创建对象,然后通过set方法注入属性
<bean id="user" class="com.chen.pojo.User">
<property name="name" value="chen"/>
</bean>
通过无参构造方法来创建对象有三种方法:
java实体类如下
package com.zhang.bean;
/**
* @title: Hello
* @Author 张宜强
* @Date: 2021/7/20 9:53
* @Effect:
*/
public class Hello {
private String name1;
private String name2;
private int name3;
public Hello(String name1, String name2, int name3) {
this.name1 = name1;
this.name2 = name2;
this.name3 = name3;
}
@Override
public String toString() {
return "Hello{" +
"name1='" + name1 + '\'' +
", name2='" + name2 + '\'' +
", name3=" + name3 +
'}';
}
public void show(){
System.out.println(this.toString());
}
}
配置如下
<!-- 第一种根据index参数下标设置 -->
<bean id="hello1" class="com.zhang.bean.Hello">
<!-- index指构造方法 , 下标从0开始 -->
<constructor-arg index="0" value="Spring1"/>
<constructor-arg index="1" value="Spring1"/>
<constructor-arg index="2" value="1"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="hello2" class="com.zhang.bean.Hello">
<!-- name指参数名 -->
<constructor-arg name="name1" value="Spring2"/>
<constructor-arg name="name2" value="Spring2"/>
<constructor-arg name="name3" value="2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="hello3" class="com.zhang.bean.Hello">
<constructor-arg type="java.lang.String" value="Spring3"/>
<constructor-arg type="java.lang.String" value="Spring3"/>
<constructor-arg type="int" value="3"/>
</bean>
输出结果: