美文网首页
Spring 依赖注入和依赖查找

Spring 依赖注入和依赖查找

作者: Tinyspot | 来源:发表于2022-12-25 19:48 被阅读0次

    1. 三种依赖注入

    1.1 构造器注入(推荐)

    • 使用构造函数给成员变量赋值
    • 通过配置的方式,让 Spring 框架为我们注入

    方式一:index 指定参数的索引位置

    <bean id="userService" class="org.cooboot.service.UserServiceImpl">
        <constructor-arg index="0" value="tinyspot" />
        <constructor-arg index="1" ref="otherBean" />
    </bean>
    

    方式二:name 指定参数名称

    <bean id="userService" class="org.cooboot.service.UserServiceImpl">
        <constructor-arg name="name" value="tinyspot" />
        <constructor-arg name="age" value="20" />
        <constructor-arg index="1" ref="otherBean" />
    </bean>
    

    1.2 Setter 方法注入

    • 可以按需注入
    <bean id="user" class="org.cooboot.entity.User">
      <property name="name" value="tinyspot" />
      <property name="age" value="20" />
    </bean>
    

    1.3 字段注入

    • 参数注入(spring framerwork 4.0 后不推荐使用)
    • @Autowired
    • @Resource
    • @Inject
    @Autowired
    private OrderService orderService
    

    @Autowired 处有一个黄色的波浪线提示 "Field injection is not recommended"(不推荐使用字段注入)

    1.4 三种注入方式的优缺点

    Spring所提供的三种依赖注入类型:
    构造器注入适合于强制对象注入;
    Setter注入适合于可选对象注入;
    而字段注入是应该被避免使用的,因为对象无法脱离容器而独立运行

    • 构造器注入
      • 优:会固定依赖注入的顺序;该方式不允许我们创建bean对象之间的循环依赖关系
      • 缺:需要注入的对象特别多的时候,我们的构造器就会显得非常的冗余;如果真的出现构造器参数列表过长的情况,可能是这个 Bean 承担的责任太多,应该考虑组件的责任拆解
    • 参数注入
      • 无法注入 final 修饰的变量;final 修饰的变量,在实例化后就不可变,因此只能使用基于构造函数的依赖注入的方式
      • 类与DI容器高度耦合,我们不能在外部使用它(与 Spring 的 IOC 机制紧密耦合)

    2. 两种依赖查找

    • byType :按照 Bean 的类型查找,@Autowired 注解使用的是该策略
    • byName : 按照 Bean 的名称查找,@Resource 注解使用的是该策略
    注解 注入方式 是否支持@Primary 来源 Bean不存在时处理
    @Autowired byType SpringFramework原生注解 可指定 required=false 来避免注入失败
    @Resource byName JSR250规范 容器中不存在指定Bean会抛出异常
    @Inject byType JSR330规范 ( 需要导jar包 ) 容器中不存在指定Bean会抛出异常

    2.1 @Autowired

    • 是 Spring 的自动装配,根据类型进行自动装配的

    默认情况下要求依赖对象必须存在,如果需要允许 NULL 值,可以设置 @Autowired(required = false)

    如果要按名称装配,可以使用 @Autowired + @Qualifier("beanName") ,指定唯一的 bean 对象

    2.2 @Resource

    • 是 Java 的自动装配,默认 byName,找不到再byType

    注意:如要指定了 name 属性 @Resource(name="beanName") 就只会按照名称进行装配

    2.3 @Inject

    • 根据类型自动装配
    • 如果需要按名称进行装配,需要配合 @Named

    3. 依赖注入不同类型的属性

    3.1 简单类型(value)

    <bean id="user" class="org.cooboot.entity.User">
        <property name="name" value="tinyspot" />
        <property nmae="age" value="20" />
    </bean>
    

    3.2 引用类型(ref)

    <bean id="userService" class="org.cooboot.service.UserServiceImpl">
        <property name="userDao" ref="userDao" />
    </bean>
    
    <bean id="userDao" class="org.cooboot.mapper.UserDao" />
    

    3.3 集合类型

    数组或 List 集合

    <bean id="user" class="org.cooboot.entity.User">
      <property name="list">
        <list>
          <value>aaa</value>
          <value>aaa</value>
        </list>
      </property>
    </bean>
    

    POJO 类型的集合

    <bean id="bean1" class="" />
    <bean id="bean2" class="" />
    <bean id="user" class="org.cooboot.entity.User">
      <property name="list">
        <list>
          <ref bean="bean1" />
          <ref bean="bean2" />
        </list>
      </property>
    </bean>
    
    <bean id="user" class="org.cooboot.entity.User">
      <property name="list">
        <list>
          <bean class="" >
              <constructor-arg value="">
          </bean>
          <bean></bean>
        </list>
      </property>
    </bean>
    

    Set 集合

    <bean id="user" class="org.cooboot.entity.User">
      <property name="sets">
        <set>
          <value>aaa</value>
          <value>aaa</value>
        </set>
      </property>
    </bean>
    

    Map集合

    <bean id="user" class="org.cooboot.entity.User">
      <property name="map">
        <map>
          <entry key="1001" value="aaa">
          <entry key="1002" value="bbb">
        </map>
      </property>
    </bean>
    

    Properties 集合

    <property name="pros">
      <props>
        <prop key="name">tinyspot</prop>
        <prop key="age">20</prop>
      </props>
    </property>
    

    相关文章

      网友评论

          本文标题:Spring 依赖注入和依赖查找

          本文链接:https://www.haomeiwen.com/subject/fppgqdtx.html