前言:

本文内容:IOC本质,HelloSpring、IOC创建对象方式

推荐免费Spring5基础教程视频:【狂神说Java】Spring5最新完整教程IDEA版通俗易懂_哔哩哔哩_bilibili

IOC本质

控制反转IOC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是IOC的另一种说法。所谓控制反转,就是获得依赖对象的方式反转了。

IOC是Spring框架的核心内容,使用多种方式完美实现IOC,可以使用XML配置,也可以使用注解,新版本可以零配置实现IOC。

Spring容器在初始化时先读取配置文件,根据配置文件或元数据创建和组织对象存入容器中,程序使用时再从IOC中取出需要的对象

container magic

采用XML方式配置Bean的时候,Bean的定义信息和实现分离,而采用注解的方式可以把连着合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

总结

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式,在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入DI

HelloSpring

  1. 新建一个Maven父工程Spring-Study并引入依赖

    1
    2
    3
    4
    5
    6
    <!--Spring Web MVC-->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.19</version>
    </dependency>
  2. 新建一个模块spring-02-hellospring

  3. 编写一个Hello实体类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    package com.jokerdig.pojo;

    /**
    * @author Joker大雄
    * @data 2022/5/11 - 10:49
    **/
    public class Hello {
    private String name;

    public Hello(String name) {
    this.name = name;
    }

    public Hello() {

    }

    public String getName() {
    return name;
    }

    public void setName(String name) {
    this.name = name;
    }

    @Override
    public String toString() {
    return "Hello{" +
    "name='" + name + '\'' +
    '}';
    }
    }
  4. 在resources新建beans.xmlapplicationContext.xml

    配置获取地址:Core Technologies (spring.io)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 使用spring创建对象 spring都称为Bean
    正常创建
    类型 变量名 = new 类型();
    Hello hello = new Hello();

    id = 变量名
    class = new对象
    property 相当于为对象属性赋值
    这里的赋值还是使用pojo中的set方法
    -->
    <bean id="hello" class="com.jokerdig.test.pojo.Hello">
    <!-- name 实体类中定义的变量
    ref 引用Spring容器中创建好的对象
    value 具体的值
    -->
    <property name="name" value="Spring"/>
    </bean>
    </beans>
  5. 创建测试类进行调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    package com.jokerdig.test;

    import com.jokerdig.test.pojo.Hello;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    /**
    * @author Joker大雄
    * @data 2022/5/11 - 11:00
    **/
    public class test {

    // 这里使用IDEA导入junit的相关依赖
    @Test
    public void test(){
    // 允许容器从各种外部资源(如本地文件系统、Java 等)加载配置元数据
    ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
    // 通过context拿到我们需要的值
    Hello hello = (Hello) context.getBean("hello");
    System.out.println(hello.toString());
    }
    }
  6. 运行结果

    1
    2
    3
    Hello{name='Spring'}

    Process finished with exit code 0

现在我们若要修改内容,不需要去改代码,而是修改对应的配置文件即可(降低耦合)

IOC创建对象方式

  1. Spring使用无参构造创建对象(默认)

    1
    2
    3
    4
    <!--    这里本质使用实体类的无参构造 默认-->
    <bean name="user" class="com.jokerdig.pojo.User">
    <property name="name" value="Joker大雄"/>
    </bean>
  2. Spring通过有参构造创建对象

    1. 通过索引创建

      1
      2
      3
      4
      <!--使用下标赋值 不需要无参构造-->
      <bean id="index" class="com.jokerdig.pojo.User">
      <constructor-arg index="0" value="Joker大雄"/>
      </bean>
    2. 通过类型创建

      1
      2
      3
      4
      <!--    通过参数类型 不建议使用-->
      <bean id="type" class="com.jokerdig.pojo.User">
      <constructor-arg type="java.lang.String" value="Joker大雄"/>
      </bean>
    3. 通过参数名创建

      1
      2
      3
      4
      <!--  直接通过参数名设置  -->
      <bean id="user1" class="com.jokerdig.pojo.User">
      <constructor-arg name="name" value="Joker大雄"/>
      </bean>

总结:在配置文件加载的时候,容器中管理的对象就已经初始化了!