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>
网友评论