美文网首页
第二章 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