美文网首页
第二章 IoC控制反转

第二章 IoC控制反转

作者: 水墨九 | 来源:发表于2021-12-26 21:04 被阅读0次

    2.1 概念

    IoC Inversion of Control :控制反转,是一个理论,一个指导思想。指导开发人员如何使用对象去管理对象。把对象的创建、属性赋值、对象的生命周期都交给代码之外的容器管理。(应该用容器来管理对象)。
    1)IoC分为:控制和反转

    • 控制:对象创建、属性赋值、对象生命周期的管理。
    • 反转:
      正转:开发人员在代码中,使用new构造方法创建对象,开发人员掌握了对象的创建、属性赋值、对象从开始到销毁的全部过程,开发人员对对象全部控制。、
      反转:把开发人员管理对象的权限转移给了代码之外的容器来实现,由容器来完成对对象的管理。
      通过容器可以使用容器中的对象(容器已经创建了对象,对象属性赋值了,对象也组装好了)。spring就是一个容器,可以管理对象、创建对象,给属性赋值。
      2)IoC的技术实现
      DI(依赖注入):dependency indjection,是IoC的一种技术实现。程序只需要提供要使用的对象的名称就可以了,对象如果创建、如何从容器中查找、获取都由容器内部自己实现。
      3)Spring 框架使用的DI实现IoC
      通过spring框架,只需要提供要使用的对象的名称就可以了。从容器中获取名称对应的对象。Spring的底层是使用的反射机制,通过反射创建对象、给属性赋值。

    2.2 Spring的配置文件

    <?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
    </beans>
    spring的标准配置文件:
    1)根标签是beans
    2)beans后边的是约束文件说明

    2.3 Spring容器创建对象的特点

    1、容器对象ApplicationContext:接口
    通过ApplicationContext对象,获取要使用的其他java对象,执行getBean("id")
    2、Spring默认是调用类的无参构造方法,创建对象
    3、Spring读取配置文件,一次创建好所有的java对象,都放在map中。

    2.4 给属性赋值

    Spring调用类的无参构造方法,创建对象,对象创建后给属性赋值。给属性赋值可以使用:

    • xml配置文件中的标签和属性
    • 使用注解
      DI分类: set注入,也叫做设置注入、构造注入

    2.4.1基于xml的DI

    在xml的配置文件中,来完成对象的创建,属性赋值
    1)set注入,也叫作设置注入
    概念:Spring调用类中的set方法,在set方法中可以完成属性赋值,推荐使用

     <!--简单类型的设值注入-->
        <bean id="mySchool" class="com.wh.ch02dixml.ba02.School">
            <property name="name" value="北京大学"/>
            <property name="address" value="海淀区"/>
        </bean>
    
    <!-- 引用类型的设值注入-->
      <bean id="myStudent" class="com.wh.ch02dixml.ba02.Student">
            <property name="name" value="李四"/>
            <property name="age" value="20"/>
    
            <!--引用类型的赋值-->
            <property name="school" ref="mySchool"></property>
        </bean>
    

    2)构造注入
    Spring调用勒种的有参的构造方法,在创建对象的同时,给属性赋值(name ,index,省略index)

       <!--构造注入-->
        <bean id="myStudent" class="com.wh.ch02dixml.ba03.Student">
            <constructor-arg name="myName" index="0" value="李四"/>
            <constructor-arg name="myAge" index="1" value="20"/>
            <constructor-arg name="mySchool" index="2" ref="mySchool"/>
        </bean>
    
        <!--声明school-->
        <bean id="mySchool" class="com.wh.ch02dixml.ba03.School">
            <property name="name" value="北京大学"/>
            <property name="address" value="海淀区"/>
        </bean>
    

    3)引用类型的自动注入
    概念:Spring可以根据某些规则给引用类型完成赋值,只对引用类型有效。规则byName,byType

    • byName(按名称注入):java类中引用类型属性名称和Spring容器中bean的id名称一样,而且数据类型也是一样的,这些bean能够赋值给引用类型。
      <!--byName自动注入-->
        <bean id="myStudent" class="com.wh.ch02dixml.ba04.Student" autowire="byName">
            <property name="name" value="李四"/>
            <property name="age" value="20"/>
        </bean>
    
        <!--声明school-->
        <bean id="school" class="com.wh.ch02dixml.ba04.School">
            <property name="name" value="清华大学"/>
            <property name="address" value="海淀区"/>
        </bean>
    
    • byType(按类型注入):java类中引用类型的数据类型和Spring容器中bean的class值是同源关系的,这样的bean赋值给引用类型
      注意:符合条件的对象只能有一个,多余一个是报错的
    
        <!--byName自动注入-->
        <bean id="myStudent" class="com.wh.ch02dixml.ba05.Student" autowire="byType">
            <property name="name" value="张三"/>
            <property name="age" value="26"/>
        </bean>
    
        <!--声明school-->
        <bean id="mySchool" class="com.wh.ch02dixml.ba05.School">
            <property name="name" value="航空大学"/>
            <property name="address" value="海淀区"/>
        </bean>
    
        <!--声明school的子类-->
    <!--    <bean id="primarySchool" class="com.wh.ch02dixml.ba05.PrimarySchool">
            <property name="name" value="北京大兴小学"/>
            <property name="address" value="大兴区"/>
        </bean>-->
    

    4)项目中使用多个spring配置文件
    方式:

    • 按照功能模块,一个模块一个配置文件
      -按照功能分,数据库操作相关的类放在一个配置文件,service放在一个配置模块,配置redis、事务等等。
      Spring管理多个配置文件,常用的是包含关系的配置文件,项目中由一个总的配置文件,里边由import标签包含其他的多个配置文件。
      语法:
    总的xml
    <import resource="其他文件的路径">
    
    关键字:classpath:表示类的路径,也就是类文件class文件所在的目录。spring到类的路径中加载文件。
    什么时候使用classpath:在一个文件中使用其他的文件,需要使用classpath
    <!--
            当前是总的文件,目的是包含其他多个配置文件,一般不声明bean
            语法:
            <import resource="classpath:其他文件路径" />
            classpath:表示类路径,类文件所在的目录,spring是通过类路径加载配置文件
     -->
    <!--    <import resource="classpath:ba06/spring-school.xml"/>-->
    <!--    <import resource="classpath:ba06/spring-student.xml"/>-->
    
    <!--
        包含关系的配置文件,可使用通配符(*:表示任意字符)
        注意:总的文件名称,不能包含在通配符范围内
        <import resource="classpath:ba06/spring-*.xml" />
    -->
        <import resource="classpath:ba06/spring-*.xml" />
    

    2.4.2基于注解的DI

    基于注解的DI:使用spring提供的注解,完成Java对象创建、属性赋值。
    注解使用的核心步骤

    • 在源代码中加入注解,例如:@component
    • 在spring的配置文件中,加入组件扫描器的标签:
      <context:component-scan base-package="注解所在包名"/>
      1、创建对象的注解
      @Component
      @Respository
      @Service
      @Controller

    2、简单类型属性赋值
    @Value

    3、引用类型赋值

    • @AutoWired:spring提供的注解,支持byName、byType.默认byType, @Autowired + @Qualifier 使用byName

    • @Resource:来自JDK的注解,给引用类型类型赋值的,默认是byName。先使用byName,再用byType
      @Resource(name="bean的名称"):只使用byName注入

    2.5 IoC总结

    IoC:管理对象的,把对象放在容器中,创建、赋值、管理依赖关系。通过管理对象,实现解耦合。IoC解决处理业务逻辑对象之间的耦合关系,也就是service和dao之间的解耦合

    spring作为容器,管理什么对象?

    • service、dao
    • 工具类对象
      不适合?
    • 实体类。(数据是动态的,数据库查出来的、前端读取的用户数据之类的)
    • servlet、listener、filter等web中的对象。他们是tomcat创建和管理的。

    相关文章

      网友评论

          本文标题:第二章 IoC控制反转

          本文链接:https://www.haomeiwen.com/subject/eixofrtx.html