美文网首页
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>

相关文章

  • 依赖查找和依赖注入

    依赖查找和依赖注入的区别 依赖查找:容器中的对象通过Api来查找自己所依赖的资源和对象 依赖注入:依赖对象和注入对...

  • Spring系列之依赖查找和依赖注入深入探讨

    Spring依赖查找和依赖注入 演示简单的Bean工厂环境,使用Xml进行相关Bean的配置 定义两个简单的POJ...

  • Spring学习之依赖注入

    Spring学习之依赖注入 依赖注入的基本概念 依赖注入(Dependecy Injection),也称为IoC(...

  • 依赖注入

    依赖注入 Spring支持两种依赖注入方式,分别是属性注入和构造函数注入.除此之外,Spring 还支持工厂方法注...

  • Spring学习手册(5)—— bean作用域

    Spring学习手册(4)—— Spring 依赖注入中介绍了Spring依赖注入的基本方式以及各种类型的参数注入...

  • 初识Spring架构

    对Spring的了解 依赖注入DI(Dependency injection) DI分为依赖和注入 那怎么将对象注...

  • Spring bean注解

    Spring自带依赖注入注解 @Required,依赖检查 @Autowired,根据Type注入 @Value,...

  • 浅析Spring IOC、依赖注入(DI)和依赖查找(DL)

    为什么要用IOC? 第一:对象的实例化不是一件简单的事情,比如对象的关系比较复杂,依赖关系往往需要程序员去维护,这...

  • 第三章 在spring中引入IoC和DI

    概念关系 控制反转(IoC) VS 依赖注入(DI) 控制反转可以分为两种子类型:依赖注入(DI)和依赖查找 1....

  • spring

    18.7.22属性注入和构造器注入区别Spring也同时支持两种依赖注入方式:设值注入和构造注入。 这两种依赖注入...

网友评论

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

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