2.3基于XML的DI-第2章 IoC控制反转

2.3基于XML(配置文件)的DI

di的实现有两种:
1.在spring的配置文件中,使用标签和属性完成,叫基于xml的di实现

di的语法分类:
1.set注入(设值注入):spring调用类的set方法,在set方法可以实现属性的赋值。

  • 简单类型的set注入
    一个property 标签只能给一个属性赋值
    需要set方法,没有set方法会报错
<bean id="yy" class="yy">
    <property name="属性名字" value="此属性的值">
</bean>
如
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
        <property name="name" value="李四"/>
        <property name="age" value="20"/>
    </bean>

对于已经创建好的对象××,只要有set××()。那么就可以用set注入,如:

执行流程:

测试文件中指定spring配置文件的名称

//指定spring配置文件的名称
        String config = "ba01/applicationContext.xml";

->创建对象ac用的类是ClassPathXmlApplicationContext ,
ClassPathXmlApplicationContext 读config(指向beans.xml文件)

//创建表示spring容器的对象
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);

-> 在配置文件中遇到bean标签,调用类(java.util.Date)的构造方法创建对象(mydate)

<bean id="mydate" class="java.util.Date">
        <property name="time" value="65465315"/>
    </bean>

->property 标签调用类(java.util.Date)中(time)对应的set方法并进行赋值

public void setTime(long time) {
        fastTime = time;
        cdate = null;
    }
  • 引用类型的设值注入
    1.先在Student类中引用School类并定义其set方法


    引用类型注入1.png

    2.定义School类中的对象和set方法


    引用类型注入2.png

    3.在配置文件中声明School对象,并在Student对象的bean标签中调用
<bean id="xxx" class="yyy">
    <property name="属性名称" ref="bean的id(对象的名称)">
</bean>
引用类型注入3.png
  • 构造注入:spring调用类有参数构造方法,在创建对象的同时,在构造方法中给属性赋值。


    构造注入1.png
构造注入2.png
构造注入3.png

使用构造注入创建文件对象

构造注入创建文件对象.png
构造注入创建文件对象2.png
构造注入创建文件对象3.png

注入:就是赋值的意思
简单类型:spring中规定Java的基本数据类型和string都是简单类型。
di:依赖注入,表示创建对象,给属性赋值。

引用类型的自动注入

自动注入:即简化对象的赋值
引用类型的自动注入:spring框架根据某些规则可以给引用类型赋值
常用的使用规则是byName,baType。

1.byName(按名称注入):

Java类中引用类型的属性名和spring容器中(配置文件)<bean>的id名称一样且数据类型是一致的,这样的容器中的bean,spring能够赋值给引用类型。

         语法:
          <bean id="xx" ,class="yy" autowire="buName">
            简单类型属性赋值
          </bean>  

执行流程

1)创建容器时,读配置文件


引用类型的自动注入1.png

2)在配置文件中,遇到<bean>标签调用无参构造创建对象,并给简单类型赋值。遇到<autotwire = "buName">标签时给指定类中所有引用类型,按照byName规则,让spring赋值。

Java类中引用类型的属性名和spring容器中(配置文件)<bean>的id名称一样且数据类型是一致的

去类中找引用类型
将类中找到的引用类型的属性名,与配置文件中每个<bean>标签id名称比较

当引用类型的属性名和spring容器中(配置文件)<bean>的id名称一样,且数据类型是一致时。



复杂类型的注入

<!--复杂类型的注入-->
   <bean id="user" class="org.example.entity.User">
       <property name="id" value="001"/>
       <property name="name" value="zhangsan"/>
   </bean>

   <bean id="class" class="org.example.entity.Class">
       <property name="className" value="软工3班"/>
       <property name="major" value="软件工程"/>
       <property name="student">
           <list>
               <ref bean="user"/>
           </list>
       </property>
   </bean>
public class Class {
   private String className;
   private String major;
   private List<User> student;
   //此处省略setter、getter和toString方法
}
public class User {
   private int id;
   private String name;
   //此处省略setter、getter和toString方法
}

2.byType(按类型注入):

Java类中引用类型的数据类型和spring容器中(配置文件)<bean>的class属性是同源关系的 ,这样bean能够赋值给引用类型

同源(一类的意思):
1.Java类中引用类型的数据类型和<bean>标签的class属性值一样
2.Java类中引用类型的数据类型(父类)和<bean>标签的class属性值(子类)是父子类关系
3.Java类中引用类型的数据类型(接口)和<bean>标签的class属性值(实现类)是接口和实现类的关系

注意:在byType中,在xml配置文件中只能有一个符合条件对象,无唯一<bean>会报错。
语法:
    <bean id="xx" ,class="yy" autowire="buType">
        简单类型属性赋值
    </bean>

执行流程

1)创建容器时,读配置文件


引用类型的自动注入6.png

2)在配置文件中,遇到<bean>标签调用无参构造创建对象,给简单类型赋值。遇到<autotwire = "byType">标签时给指定类中所有引用类型,按照byType规则,让spring赋值。

Java类中引用类型的数据类型和spring容器中(配置文件)<bean>的class属性是同源关系

去指定类,找到引用类型,并取出其数据类型
比较配置文件中所有<bean>标签的class属性,寻找具有同源关系的<bean>标签,并将其值赋给类中的引用类型。

总结:

set注入可以实现引用对象按名称自动注入(byName)

set注入的引用对象按类型自动注入(byType)有两种情况:

1.在配置文件中只声明一个对象


2.在配置文件中声明了多个对象


所以你要用哪个对象就用bean声明哪个

构造注入无法实现引用对象自动注入

构造注入不能自动注入的原因.png
构造注入不能自动注入之解析.png

多配置文件的使用

1.包含关系的配置文件

主配置文件:包含其他的配置文件,不定义对象。

语法:<import resource="其他配置文件的路径"/>
关键字:“classpath”表示类路径(class文件所在的目录)
       在spring的配置文件中要指定其他文件的位置,
       需要使用classpath,告诉spring到哪去加载读取文件。
主配置文件指定其他文件的路径,不声明对象
主配置文件可用*指定同一包内所有配置文件的路径,主配置文件名称不能包含在*里面,否则会死循环。
声明school模块中的所有对象
声明student模块中的所有对象
加载总配置文件路径

笔记来源:B站动力节点 spring学习视频

视频链接:https://www.bilibili.com/video/BV1nz4y1d7uy

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容