Spring——IOC

Posted 我要进阿里!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring——IOC相关的知识,希望对你有一定的参考价值。

声明:本博客仅仅是一个初学者的学习记录、心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流、一起学习、一起进步的朋友可以加我微信Liu__66666666

这是简单学习一遍之后的记录,后期还会修改。

一、Bean

​ “Bean”本意为”豆子“,豆子本身就是种子,种豆得豆;而在java中,“类”又叫“javaBean”,就相当于种子,我们可以通过类来创建对象,例如有个Apple类,那我们就可以通过这个类来获得Apple实例对象。

​ 我们都知道Spring是通过容器来管理Bean的,其实容器中内容的基本单位就是bean,Spring中有很多个bean,每个bean对应一个javaBean。

二、控制反转(IoC)

​ 我们如果想种苹果的话,需要自己亲手种,这样很麻烦。那怎么办呢?现在有家店,你给他苹果种子,他就可以帮你种树,并将成熟的苹果交给你;而Spring就相当于这家店,你把JavaBean给他,他就把Bean放在容器里培养,当你需要一个实例对象的时候,他就会给你,就完全省去了我们手动创建对象的过程。

    <img src="https://img2018.cnblogs.com/blog/1799182/201909/1799182-20190922131158405-811366751.png" alt="image-20190922113348386" style="zoom:50%;" margin="0 auto"/>
  1. 控制反转配置方式

    • 基于XML
      • 无参构造方式
      • 静态工厂方式
      • 实例工厂方式
    • 基于注解
  2. 一个基于XML配置的控制反转Demo

    • 创建一个项目(建议通过Maven/Gradle来管理项目,本文使用Maven)

    • 导入jar包:通过Maven/Gradle等自动导入或手动下载导入

      <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.1.0.RELEASE</version>
      </dependency>
      <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>5.1.0.RELEASE</version>
      </dependency>
      
    • 在java或resources目录下创建applicationContext.xml文件,它是Spring 的核心配置文件。

      image-20190922113348386
      <?xml version="1.0" encoding="UTF-8"?>
      <beans
              xmlns="http://www.springframework.org/schema/beans"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns:context="http://www.springframework.org/schema/context"
              xsi:schemaLocation="
                  http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://www.springframework.org/schema/context
                  http://www.springframework.org/schema/context/spring-context.xsd">
      </beans>
      
    • 在src/main/java/ioc下创建Apple.java类

      package ioc;
      
      public class Apple {
          private Integer id;
          private String color;
      
          public Apple() {
          }
      // 此处略去所有getter、setter方法
      //此处略去toString方法
      }
      
    • 在applicationContext.xml中将Apple这个类添加到Spring容器中

      <?xml version="1.0" encoding="UTF-8"?>
      <!--这里为了省空间直接把beans里面的属性省略掉了-->
      <beans>
        	<!--这样配置的话,Spring会使用javaBean中的无参构造帮我们实例化对象-->
      		<!--所以一定要写无参构造-->
          <bean id="apple" class="ioc.Apple"/>
      </beans>
      

      bean标签里的id属性,是每个bean的唯一标识,我们可以在java代码中通过这个id获取到该bean对应的实例对象;class属性是该类的全限定名。

    • 编写测试类

      public class AppleTest {
        	//考虑到部分朋友没接触过Junit所以这里就这样简单测试下
          public static void main(String[] args) {
            
            //这里获取的是applicationContext.xml这个配置文件的对象
            //通过它可以获取配置文件中配置的bean对象
              ApplicationContext context=
                      new ClassPathXmlApplicationContext("applicationContext.xml");
      
            //调用ApplicationContext的getBean(String id,Class<T> clazz)方法
            //获取对应的实例对象,我们定义了apple所以就写上”apple“
              Apple apple = context.getBean("apple", Apple.class);
            
            //获取到对象之后就可以正常使用了
              apple.setId(1);
              apple.setColor("green");
              System.out.println(apple);
          }
      }
      

      输出结果:

      Apple{id=1, color=\'green\'}

      OK,是我们预期的结果。经过一顿操作是不是觉得Spring好像也很麻烦?但是Spring不这样用,这只是个demo,实际用起来会非常方便简洁。

  3. 一个基于注解的控制反转Demo

    • 创建项目(建议通过Maven/Gradle来管理项目,本文使用Maven)

    • 导入jar包,见上文“一个基于XML配置的控制反转Demo”

    • 创建applicationContext.xml和Apple类(同上)

    • 为Apple类添加注解(就不用配bean标签了)

      @Component
      public class Apple {}
      

      ​ id默认为类名的首字母小写形式,例如Apple的id为apple,AppleService的id为appleService

      也可使用value属性指定: @Component(value = "apple")

      ​ 注解写在类声明的上方,注解有@Component、@Controller、@Service、@Repository,这四个注解的作用完全相同,设计四个主要为了区分不同的层,例如@Controller是用于视图控制层、@Service用于服务层、@Repository用于持久层。当然,如果在持久层用@Controller也不会报错,但是不建议这样写。

    • 在applicationContext.xml开启注解并配置包扫描

      • 开启注解: <context:annotation-config/>

      • 配置包扫描(就是设置一下让Spring帮我们自动扫描哪些包,例如设置了名为ioc的这个包,那ioc这个包下所有添加了@Component/@Controller/@Service/@Repository注解的JavaBean都会被自动添加到Spring 的容器中)

        <context:component-scan base-package="ioc"/>

        bese-package这个属性可以配置多个包,以半角逗号分隔,例如base-package=“ioc,mvc”

    • 编写测试类

      public class AppleTest {
          public static void main(String[] args) {
              ApplicationContext context=
                      new ClassPathXmlApplicationContext("applicationContext.xml");
      
              Apple apple = context.getBean("apple", Apple.class);
              apple.setId(1);
              apple.setColor("green");
              System.out.println(apple);
          }
      }
      

      输出结果:

      Apple{id=1, color=\'green\'}

      OK,结果还是符合预期。

  4. 总结

    • 基于XML和无参构造配置的IoC:
      • 导入jar包
      • 创建applicationContext.xml文件
      • 创建JavaBean
      • 在applicationContext.xml中使用标签将JavaBean添加到Spring容器中
      • java代码通过中的id属性获得对应实例对象并使用
    • 基于注解配置的IoC:
      • 导入jar包
      • 创建applicationContext.xml文件,开启注解并配置包扫描
      • 创建JavaBean并为其添加注解
      • 在java代码中通过id来获得实例对象并使用

以上是关于Spring——IOC的主要内容,如果未能解决你的问题,请参考以下文章

Spring之IOC原理及代码详解

Spring IOC源代码具体解释之整体结构

Spring 框架学习——IOC思想原型及实质

Spring IOC源代码具体解释之容器依赖注入

[Spring 源解系列] 重温 IOC 设计理念

Spring IoC