Spring 依赖注入和依赖查找

2022-12-25  本文已影响0人  Tinyspot

1. 三种依赖注入

1.1 构造器注入(推荐)

方式一: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 字段注入

@Autowired
private OrderService orderService

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

1.4 三种注入方式的优缺点

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

2. 两种依赖查找

注解 注入方式 是否支持@Primary 来源 Bean不存在时处理
@Autowired byType SpringFramework原生注解 可指定 required=false 来避免注入失败
@Resource byName JSR250规范 容器中不存在指定Bean会抛出异常
@Inject byType JSR330规范 ( 需要导jar包 ) 容器中不存在指定Bean会抛出异常

2.1 @Autowired

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

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

2.2 @Resource

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

2.3 @Inject

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>
上一篇 下一篇

猜你喜欢

热点阅读