8.2.3 使用@Resource和@Value配置依赖

8.2.3 使用@Resource和@Value配置依赖

@Resource位于Javax.annotation包下,是来自Java EE规范的一个注解, Spring直接借鉴了该注解,通过使用该注解为目标Bean指定协作者Bean

使用@Resource来注入其他Bean

@Resource有一个name属性,在默认情况下, Spring将这个name属性的值解释为需要被注入的Bean实例的id,换句话说,使用@Resource<property>元素的ref属性有相同的效果

使用@Value来注入直接量

@Value则相当于<property>元素的value属性,用于为Bean的标量属性配置属性值。@Value注解还可使用表达式。

@Resource @Value直接修饰实例变量

@Resource@Value不仅可以修饰setter方法,也可以直接修饰实例变量。如果使用@Resource@Value修饰实例变量将会更加简单,此时Spring将会直接使用Java EE规范的Field注入,此时连setter方法都可以不要。

例如如下的Bean类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package org.crazyit.app.service.impl;

import org.springframework.stereotype.*;
import org.springframework.beans.factory.annotation.*;
import javax.annotation.*;
import org.crazyit.app.service.*;

@Component
public class Chinese implements Person
{
@Value("#{T(Math).PI}")
private String name;
private Axe axe;
// axe的setter方法
@Resource(name = "stoneAxe")
public void setAxe(Axe axe)
{
this.axe = axe;
}
// 实现Person接口的useAxe()方法
public void useAxe()
{
System.out.println(name + "正在砍柴");
// 调用axe的chop()方法,
// 表明Person对象依赖于axe对象
System.out.println(axe.chop());
}
}

上面的Chinese类中:

  • 使用了@Value注解为name成员变量设置值,且该值使用了SpEL表达式;
  • 定义了一个@Resource注解,该注解将容器中idstoneAxe的另一个Bean作为setAxe方法的参数

省略name属性时@Resource注解如何确定要注入哪个Bean

Spring允许使用@Resource时省略name属性,当使用省略name属性的@Resource修饰setter方法时,name属性值默认为该setter方法去掉前面的set子串、首字母小写后得到的子串。

使用setter方法名称来确定要注入的Bean

  • 例如,使用@Resource标注setName()方法,则Spring默认会注入容器中名为name的组件;当使用省略name属性的@Resource修饰实例变量时,name属性值默认与该实例变量同名。

使用示例变量的名称来确定要注入的Bean

  • 例如,使用@Resource标注name实例变量,则Spring默认会注入容器中名为name的组件。