DI依赖注入

mac2025-01-22  72

依赖注入:Dependency Injection:依赖关系的维护

         它是spring框架核心ioc的具体实现。 我们的程序在编写时,通过控制反转,把对象的创建交给了spring,但是代码中不可能出现没有依赖的情况。ioc解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。 那这种业务层和持久层的依赖关系,在使用spring之后,就让spring来维护了。 简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

能注入的数据:有三类

     基本类型和string

     其他bean类型(在配置文件中或者注解配置过的bean)

     复杂类型/集合类型

注入的方式:有三种

第一种:使用构造函数提供

第二种:使用set方法提供

第三种:使用注解提供

 

第一种:使用构造函数的方式,给service中的属性传值

要求: 类中需要提供一个对应参数列表的构造函数。

      涉及的标签: constructor-arg

属性:

       index:指定参数在构造函数参数列表的索引位置

       type:指定参数在构造函数中的数据类型

       name:指定参数在构造函数中的名称 用这个找给谁赋值

 =======上面三个都是找给谁赋值,下面两个指的是赋什么值的==============

       value:它能赋的值是基本数据类型和String类型

       ref:它能赋的值是其他bean类型,也就是说,必须得是在配置文件中配置过的bean

优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功

劣势:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供

例:

<bean id="accountService" class="com.service.impl.AccountServiceImpl">               <constructor-arg name="name" value="张三"></constructor-arg>               <constructor-arg name="age" value="18"></constructor-arg>               <constructor-arg name="birthday" ref="now"></constructor-arg> </bean> <bean id="now" class="java.util.Date"></bean>

第二种:使用set方法注入

涉及的标签: property

属性:

     name:找的是类中set方法后面的部分

       ref:给属性赋值是其他bean类型的

     value:给属性赋值是基本数据类型和string类型的

例:

<bean id="accountService" class="com.service.impl.AccountServiceImpl">              <property name="name" value="test"></property>              <property name="age" value="21"></property>              <property name="birthday" ref="now"></property>      </bean> <bean id="now" class="java.util.Date"></bean>

复杂类型注入

注入集合数据 List结构的: array,list,set Map结构的 map,entry,props,prop

<bean id="accountService" class="com.service.impl.AccountServiceImpl"> <!-- 在注入集合数据时,只要结构相同,标签可以互换 --> <!-- 给数组注入数据 --> <!-- 注入list集合数据 --> <property name="myList">           <array>              <value>AAA</value>              <value>BBB</value>              <value>CCC</value>           </array> </property> <!-- 注入set集合数据 --> <property name="mySet">        <list>            <value>AAA</value>            <value>BBB</value>            <value>CCC</value>        </list> </property> <!-- 注入Map数据 --> <property name="myMap">   <props>      <prop key="testA">aaa</prop>      <prop key="testB">bbb</prop>   </props> </property> <!-- 注入properties数据 --> <property name="myProps">         <map>            <entry key="testA" value="aaa"></entry>            <entry key="testB"> <value>bbb</value> </entry>        </map> </property> </bean>

第三种:使用注解的方式注入

@Autowired

作用: 自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错。

@Qualifier

作用: 在自动按照类型注入的基础之上,再按照Bean的id注入。它在给字段注入时不能独立使用,必须和@Autowire一起使用;但是给方法参数注入时,可以独立使用。 属性: value:指定bean的id。

@Resource

作用: 直接按照Bean的id注入。它也只能注入其他bean类型。

属性: name:指定bean的id。

@Value

作用: 注入基本数据类型和String类型数据的

属性: value:用于指定值,可以使用spring的SpEL表达式 ${表达式

 

最新回复(0)