使用 @Resource
进行注入
Spring 还支持使用 JSR-250 @Resource
注解 (jakarta.annotation.Resource
) 在字段或 Bean 属性 setter 方法上进行注入。这在 Jakarta EE 中是一种常见模式,例如在 JSF 管理的 Bean 和 JAX-WS 端点中。Spring 也支持这种模式用于 Spring 管理的对象。
@Resource
接受一个 name
属性。默认情况下,Spring 将该值解释为要注入的 Bean 名称。换句话说,它遵循按名称语义,如下例所示:
- Java
-
public class SimpleMovieLister { private MovieFinder movieFinder; @Resource(name="myMovieFinder") [id="CO1-1"][id="CO1-1"][id="CO1-1"](1) public void setMovieFinder(MovieFinder movieFinder) { this.movieFinder = movieFinder; } }
<1> 此行注入了一个 `@Resource`。
- Kotlin
-
class SimpleMovieLister { @Resource(name="myMovieFinder") [id="CO2-1"][id="CO1-2"][id="CO2-1"](1) private lateinit var movieFinder:MovieFinder }
<1> 此行注入了一个 `@Resource`。
如果没有明确指定名称,则默认名称从字段名或 setter 方法派生。如果是字段,则取字段名。如果是 setter 方法,则取 Bean 属性名。以下示例将把名为 movieFinder
的 Bean 注入到其 setter 方法中:
-
Java
-
Kotlin
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Resource
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
}
class SimpleMovieLister {
@set:Resource
private lateinit var movieFinder: MovieFinder
}
注解中提供的名称由 |
在 @Resource
独占使用且未明确指定名称的情况下,与 @Autowired
类似,@Resource
会查找主要类型匹配而不是特定的命名 Bean,并解析众所周知的可解析依赖项:BeanFactory
、ApplicationContext
、ResourceLoader
、ApplicationEventPublisher
和 MessageSource
接口。
因此,在以下示例中,customerPreferenceDao
字段首先查找名为 "customerPreferenceDao" 的 Bean,然后回退到 CustomerPreferenceDao
类型的主要类型匹配:
-
Java
-
Kotlin
public class MovieRecommender {
@Resource
private CustomerPreferenceDao customerPreferenceDao;
@Resource
private ApplicationContext context; [id="CO3-1"][id="CO1-3"][id="CO3-1"](1)
public MovieRecommender() {
}
// ...
}
1 | context 字段基于已知的可解析依赖类型 ApplicationContext 进行注入。 |
class MovieRecommender {
@Resource
private lateinit var customerPreferenceDao: CustomerPreferenceDao
@Resource
private lateinit var context: ApplicationContext [id="CO4-1"][id="CO1-4"][id="CO3-2"](1)
// ...
}
1 | context 字段基于已知的可解析依赖类型 ApplicationContext 进行注入。 |