DI相关内容

本文详细介绍了Spring框架中两种主要的依赖注入方式:setter注入和构造器注入。setter注入包括了引用数据类型和简单数据类型的注入,而构造器注入则通过构造方法实现。此外,文章还讨论了自动装配的概念,以及如何通过byType和byName等方式进行自动装配。最后,文章提到了集合注入,如数组、List、Set、Map和Properties类型的注入方式。
摘要由CSDN通过智能技术生成

srping为我们提供了两种注入方法:setter注入和构造器注入

1、setter注入

1.1、注入引用数据类型
  • 在bean中定义引用类型属性,并提供可访问的set方法
public class BookServiceImpl implements BookService {
    private BookDao bookDao;

    public void setBookDao(BookDao bookDao) {
        this.bookDao = bookDao;
    }
    
}
  • 配置中使用property标签ref属性注入引用类型对象
        <bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory"></bean>
        <bean id="bookService" class="com.AT.service.impl.BookServiceImpl">
                <!--配置service与dao的关系-->
                <!--property标签表示配置当前Bean的属性
                        name属性表示配置哪一个具体的属性
                        ref属性表示参照哪一个Bean
                -->
                <property name="bookDao" ref="bookDao"></property>
        </bean>
1.2、注入简单数据类型
  • 在类中声明对应的普通数据类型的属性,并提供set方法
public class BookDaoImpl implements BookDao {
    
    private String databaseName;
    private int maxInt;

    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }

    public void setMaxInt(int maxInt) {
        this.maxInt = maxInt;
    }
}
  • 配置文件中进行注入配置
<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
    <property name="databaseName" value="AT"></property>
    <property name="maxInt" value="15110"></property>
</bean>

2、构造器注入

构造器注入也就是构造方法注入。

2.1、构造器注入引用数据类型
  • 将bookserviceImpl类中的bookda的setter方法删除掉,并添加带有bookDao参数的构造方法。
public class BookServiceImpl implements BookService {
    private BookDao bookDao;

    public BookServiceImpl(BookDao bookDao) {
        this.bookDao = bookDao;
    }
}
  • 配置文件中进行配置构造方法注入
<bean id="bookService" class="com.AT.service.impl.BookServiceImpl">
        <constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
</bean>

说明:

  • name属性对应的值为构造函数中方法形参的参数名,必须保持一致。
  • ref属性指向的是spring的IOC中的其他bean对象
2.2、构造器注入简单数据类型
  • 再类中添加构造方法
public class BookDaoImpl implements BookDao {

    private String databaseName;
    private int maxInt;

    public BookDaoImpl(String databaseName, int maxInt) {
        this.databaseName = databaseName;
        this.maxInt = maxInt;
    }
}
  • 在配置文件中进行配置注入

(1)根据形参名【name属性】

<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
        <constructor-arg name="databaseName" value="AT"></constructor-arg>
        <constructor-arg name="maxInt" value="15110"></constructor-arg>
 </bean>

(2)按照类型注入【type属性】

<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
        <constructor-arg type="java.lang.String" value="AT"></constructor-arg>
        <constructor-arg type="int" value="15110"></constructor-arg>
</bean>

(3)按照索引下标注入【index属性】

<bean id="bookDao" class="com.AT.dao.Impl.BookDaoImpl" init-method="init" destroy-method="destory">
        <constructor-arg index="0" value="AT"></constructor-arg>
        <constructor-arg index="1" value="15110"></constructor-arg>
</bean>

3、依赖注入小结

介绍完两种参数的注入方式,具体的我们该如何选择呢?

(1)强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现

  • 强制依赖指对象再创建的过程中必须要注入指定的参数

(2)可选依赖使用setter注入进行,灵活性强

  • 可选依赖指对象在创建过程中注入的参数可有可无

4、自动装配

  • IOC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。
  • 自动装配有按类型(常用)、按名称、按构造方法、不启用自动装配
4.1、完成自动装配的配置

自动装配只需要修改applicationContext.xml配置文件即可:

将<property>标签删除

在<bean>标签中添加autowire属性

<bean id="bookService" class="com.AT.service.impl.BookServiceImpl" autowire="byType"></bean>

注意事项:

  • 需要注入属性的类中对应属性的setter方法不能省略。
  • 被注入的对象必须要被Spring的IOC容器管理
  • 按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException

其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
5、集合注入
5.1、注入数组类型数据
<property name="array">
    <array>
        <value>100</value>
        <value>200</value>
        <value>300</value>
    </array>
</property>
5.2、注入List类型数据
<property name="list">
    <list>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>chuanzhihui</value>
    </list>
</property>
5.3、注入Set类型数据
<property name="set">
    <set>
        <value>itcast</value>
        <value>itheima</value>
        <value>boxuegu</value>
        <value>boxuegu</value>
    </set>
</property>
5.4、注入Map类型数据
<property name="map">
    <map>
        <entry key="country" value="china"/>
        <entry key="province" value="henan"/>
        <entry key="city" value="kaifeng"/>
    </map>
</property>
5.5、注入Properties类型数据
<property name="properties">
    <props>
        <prop key="country">china</prop>
        <prop key="province">henan</prop>
        <prop key="city">kaifeng</prop>
    </props>
</property>

说明:

  • property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写 <array><list><set><map><props>标签
  • List的底层也是通过数组实现的,所以<list><array>标签是可以混用
  • 集合中要添加引用类型,只需要把<value>标签改成<ref>标签,这种方式用的比较少

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值