DI依赖注入


首先我们明确一些观点
1、注入的Bean的数据包括引用类型与简单类型(基本数据类型和字符串)
2、通过setter方法与构造方法向一个类注入数据
3、依赖注入方式setter注入引用类型与简单类型;构造器注入引用类型与简单类型


Setter注入

setter注入引用类型

1、在bean中定义引用类型属性,并提供可访问的set方法
set方法
2、 配置中使用property标签ref属性注入引用类型对象
注入引用类型

setter注入简单类型(基本数据类型和字符串)

其实把ref地址改成value值就好了。
1、我们首先在dao层类中加入数据如下(在BookDaoImpl类中声明对应的简单数据类型的属性,并提供对应的setter方法)
基本类型
2、我们在配置文件中修改赋值(在applicationContext.xml配置文件中使用property标签注入)
基本类型配置文件

对于setter注入方式的基本使用就已经介绍完了,

  • 对于引用数据类型使用的是 < property name=“” ref=“”/>
  • 对于简单数据类型使用的是 < property name=“” value=“”/>

构造器注入

构造器注入引用类型

1、删除setter方法并提供构造方法(在BookServiceImpl类中将bookDao的setter方法删除掉,并添加带有bookDao参数的构造方法)
构造器应用

2、配置文件中进行配置构造方式注入

<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
        <constructor-arg name="userDao" ref="userDao"/>
        <constructor-arg name="bookDao" ref="bookDao"/>
    </bean>

我们稍微总结一下
在这里插入图片描述

其实也只是换一个属性罢了。
name属性对应的值为构造函数中方法形参的参数名,必须要保持一致。
ref属性指向的是spring的IOC容器中其他bean对象。

构造器注入简单类型也类似咯。我们不在赘述。

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现强制依赖指对象在创建的过程中必须要注入指定的参数
  2. 可选依赖使用setter注入进行,灵活性强可选依赖指对象在创建过程中注入的参数可有可无
  3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  5. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注
  6. 自己开发的模块推荐使用setter注入

自动装配

先来熟悉一下自动装配的定义:IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。

自动装配的方式:按类型(常用);按名称 ; 按构造方法 ; 不启用自动装配

按类型(常用):

<bean class="com.itheima.dao.impl.BookDaoImpl"/> 
<!--autowire属性:开启自动装配,通常使用按类型装配--> 
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byType"/>

按名称:

<bean class="com.itheima.dao.impl.BookDaoImpl"/> 
<!--autowire属性:开启自动装配,通常使用按类型装配--> 
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl" autowire="byName"/>

在这里我们值得注意的是关于名字我们依据的是什么名字?

  • bookDao是private修饰的,外部类无法直接方法外部类只能通过属性的set方法进行访问,对外部类来说,setBookDao方法名,去掉set后首字母小写是其属性名那么为什么是去掉set首字母小写?这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对应的名是一致的。
  • 如果按照名称去找对应的bean对象,找不到则注入Null
  • 当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错

最后对于依赖注入,需要注意一些其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

集合注入

前面我们看了应用类型和基本类型的注入,那如果是Map呢、set呢,这些集合怎么办捏?

1、在类中编写属性并基于其构造方法(所以是setter注入啦)
集合注入

2、编写xml文件(按规定的格式)

<!--代码来自黑马哦,推荐跟着B站视频学,我是跟视频的,老师讲的很不错哟-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl">
        <!--数组注入-->
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <!--list集合注入-->
        <property name="list">
            <list>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>chuanzhihui</value>
            </list>
        </property>
        <!--set集合注入-->
        <property name="set">
            <set>
                <value>itcast</value>
                <value>itheima</value>
                <value>boxuegu</value>
                <value>boxuegu</value>
            </set>
        </property>
        <!--map集合注入-->
        <property name="map">
            <map>
                <entry key="country" value="china"/>
                <entry key="province" value="henan"/>
                <entry key="city" value="kaifeng"/>
            </map>
        </property>
        <!--Properties注入-->
        <property name="properties">
            <props>
                <prop key="country">china</prop>
                <prop key="province">henan</prop>
                <prop key="city">kaifeng</prop>
            </props>
        </property>
    </bean>
  • property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写、、、、标签
  • List的底层也是通过数组实现的,所以和标签是可以混用
  • 集合中要添加引用类型,只需要把标签改成标签,这种方式用的比较少
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一哑7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值