spring - 为什么我们需要在 spring-boot-starter-jersey 项目中为 Jersey 资源提供 @Component spring 注解?

标签 spring spring-boot jersey spring-annotations

这个问题是关于样本的:
https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-jersey/src/main/java/sample/jersey/Endpoint.java

为什么我们在使用 spring-boot -starter-jersey 项目时需要为 Jersey 资源添加“@Component”注解?

如果我删除它,Jersey servlet 仍然可以提供资源。

那么“@Component”有什么用呢?

最佳答案

你不需要它。泽西使用 HK2因为它是内部 DI 框架,而 HK2 有一个 Spring bridge .这是内部用于将 Spring 组件桥接到 HK2 IoC 容器中的内容,以便可以将它们注入(inject)到 Jersey 组件中。 Jersey 实现了 AutowiredInjectionResolver 1 允许使用 @Autowired 注入(inject) Spring 组件.你甚至不需要@Autowired尽管。所有Spring组件都可以正常注入(inject)@Inject .

我遇到的唯一缺点是没有将 Jersey 组件设为 Spring @Component是不支持@Value当你想注入(inject)属性值时。

我不喜欢的一件事是,当您将某事声明为 Spring @Component ,它会自动使其成为单例。但是 Jersey 资源默认是请求范围的。您可以添加 Spring @Scope("request") ,并且它应该将资源更改为请求范围的资源。 Jersey 有 declared the Spring RequestScope ,所以我们可以使用它。它与 Jersey 的请求范围到底有什么关系,我不能百分百确定。前段时间我遇到了一个问题。我不记得它是什么了,但这让我再也无法使用 Spring 请求范围。

假设我想保持所有资源请求的范围,我会坚持正常的 Jersey 请求范围,并且无法注入(inject) @Value s,不得不使用 Spring 的请求范围。也许我在想象事情,使用它没有问题,但就我个人而言,我会坚持我所知道的工作:-)

更新

如果您不将资源设为 Spring @Component,则另一件事不起作用是 Spring 的 AOP。这对我来说很好,因为 HK2 也有 AOP。

1 - 一个 InjectionResolver允许您使用自定义注释来创建注入(inject)目标。

关于spring - 为什么我们需要在 spring-boot-starter-jersey 项目中为 Jersey 资源提供 @Component spring 注解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38133680/

相关文章:

java - 通过注解的Bean继承

java - 带有嵌入式数据库的 Spring Boot 数据 jar

spring-boot - 带有 url 参数的 Kubernetes 入口路由

Java:从 HttpContext 中获取正文?

java - jersey json 尝试解码到同一对象

javascript - 在 Spring Controller 方法中发布 JavaScript 对象数组并映射到 Java 域

java - 如何在 XML 中使用 Spring Java 属性默认值

java - 使用 Redis 的 Spring 启动 session 中出现错误 - 没有 [...SessionRepository] ​​类型的合格 bean

java - Spring 启动执行器中的 Elasticsearch 运行状况检查有时会返回状态

java - 找不到合适的驱动程序异常: Hibernate