Spring中的依赖注入(三种注入方式:构造函数注入、set方法注入、基于注解注入)

本文探讨了Spring框架中的依赖注入原理,包括构造函数注入、set方法注入以及注解注入的使用,通过实例解析了它们的优势与不足,并介绍了如何通过@Component、@Autowired等注解进行对象管理和数据注入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

  依赖注入: 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明依赖关系的维护
  IoC的作用: 降低程序间的耦合(依赖关系)

注入方式

  1. 构造函数注入
    使用的标签:constructor-arg
    标签出现的位置:bean标签的内部
    标签中的属性:
属性属性值
type根据数据的数据类型进行赋值(当有多个相同数据类型,不方便)
index根据构造函数中指定索引位置的参数赋值。索引的位置是从0开始(不知晓,某个索引的数据类型是什么)
name根据构造函数中指定名称的参数赋值(更加精确、无误)
value给所定参数赋值 (包含基本数据类型、String数据类型)
ref给所定参数赋值(指定其他的bean类型)

  优势:
   在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。
  弊端:
   在创建对象时,必须依次提供该标签下的所有数据类型,如果不想提供则需书写其他<bean>标签 使其开发更加困难。因此,在这样一个问题下,有了第二种方法set方法注入。
  例子:

	<!--  创建有参的构造函数  -->
	<!--  如果想要重载构造函数,又必须命名id,很麻烦。因此诞生了,第二种注入方法  -->
    <bean id="usercountmoney_4" class="service.impl.UserCountMoney_1">
        <constructor-arg name="name" value="你是猪"></constructor-arg>
        <constructor-arg name="password" value="123456"></constructor-arg>
        <constructor-arg name="id" value="12"></constructor-arg>
        <constructor-arg name="date" ref="now"></constructor-arg>
    </bean>

    <bean id="now" class="java.util.Date"></bean>
  1. 使用set方法注入 (常用)
    使用的标签:property
    标签出现的位置:bean标签的内部
    标签中的属性:
属性属性值
name用于指定注入时所调用的set方法名称
value给所定set方法传参赋值 (包含基本数据类型、String数据类型)
ref给所定set方法传参赋值(指定其他的bean类型)

  优势:
   创建对象时,没有明确的限制,可以直接使用默认的构造函数。
  弊端:
   成员变量必须有值,否则获取对象时set方法没有执行。
  例子:

<!--  根据set方法注入  -->
    <bean id="usercountmoney_5" class="service.impl.UserCountMoney_1">
        <property name="name" value="憨批"></property>
        <property name="password" value="9999"></property>
        <property name="id" value="23"></property>
        <property name="date" ref="now"></property>
    </bean>

  注入集合数据

   1. 用于给List结构集合注入的标签:List、array、set

   2. 用于给Map结构集合注入的标签:map、props

   3. 特殊地: 结构相同、标签可互换

  例子:

<!--  注入集合数据  -->
	<!-- 结构相同、标签可互换 -->
	<!-- 便于记忆,只需要记住:List集合、Map集合即可。-->
	<!-- 但如果是学习的话。还是尽量相互对应 -->
	<!-- 数组对应:array  list集合对应:list set集合对应:set -->
	<!-- map集合对应:map  properties配置文件对应:props-->
    <bean id="usercountmoney_6" class="service.impl.UserCountMoney_2">
        <property name="myArray">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>

        <property name="myList">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>

        <property name="mySet">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
        </property>

        <property name="myMap">
            <map>
                <entry key="A" value="111"></entry>
                <entry key="B" value="222"></entry>
                <entry key="C" value="333"></entry>
            </map>
        </property>

        <property name="myProp">
            <map>
                <entry key="A" value="111"></entry>
                <entry key="B" value="222"></entry>
                <entry key="C" value="333"></entry>
            </map>
        </property>

    </bean>
  1. 使用注解方法注入
    1. 创建对象
      他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的。写在类上面
      前提: 必须在XML配置文件中配置注解扫描器。如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    
    <!--告知spring在创建容器时要扫描的包.配置所需要的标签不是在beans的约束中.而是一个名称为context名称空间和约束中-->
    <!--这样就可以不用写 <bean> 标签了  -->
    <context:component-scan base-package="service"></context:component-scan>

</beans>
注解属性含义
@Componentvalue默认值:类名的首字母小写
@Controllervalue默认值:类名的首字母小写。一般用在表现层
@Servicevalue默认值:类名的首字母小写 。一般用在业务层
@Repositoryvalue默认值:类名的首字母小写 。一般用在持久层

    2. 注入数据
     他们的作用就和在XML配置文件中的<bean>标签中写一个<property>标签的作用是一样的。写在数据类型上面
     特殊地: 对于<bean>和`基本数据类型、String数据类型可用注解。但对于集合数据类型使用xml配置文件更好一点。

注解属性含义
@Autowired自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功
如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。
@Qualifiervalue当容器中有多个bean对象类型和要注入的变量类型匹配。用于指定<bean>的id
@Resoursename上面两者的综合,用于指定<bean>的id
@Valuevalue给基本数据类型、String数据类型赋值

    3. 作用范围
     他们的作用就和在XML配置文件中的<bean>标签中使用scope属性实现的功能是一样的。写在类上面

注解属性含义
@Scopevalueprototype:多例模式
singleton:单例模式(默认)

    4. 生命周期
     他们的作用就和在XML配置文件中的<bean>标签中实现init-methoddestroy-method的作用是一样的。写在方法上面

注解含义
@PostConstruct创建对象,初始化方法
@PreDestroy对象销毁,销毁方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值