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 | package org.crazyit.app.service.impl; |
上面的Chinese
类中:
- 使用了
@Value
注解为name
成员变量设置值,且该值使用了SpEL
表达式; - 定义了一个
@Resource
注解,该注解将容器中id
为stoneAxe
的另一个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
的组件。