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的组件。