【问题标题】:Why do we need @Component spring annotation for Jersey resource in spring-boot-starter-jersey project?为什么我们需要在 spring-boot-starter-jersey 项目中为 Jersey 资源提供 @Component spring 注解?
【发布时间】:2016-11-03 04:09:36
【问题描述】:

这个问题是关于样本的: 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”有什么用呢?

【问题讨论】:

  • 只要你想注入其他 Spring 组件,资源也必须是 Spring 组件。

标签: spring spring-boot jersey spring-annotations


【解决方案1】:

你不需要它。 Jersey 使用 HK2 作为其内部 DI 框架,而 HK2 有一个 Spring bridge。这是内部用于将 Spring 组件桥接到 HK2 IoC 容器中的内容,以便可以将它们注入到 Jersey 组件中。 Jersey 实现了一个 AutowiredInjectionResolver1,它允许使用 @Autowired 注入 Spring 组件。你甚至不需要@Autowired。所有的 Spring 组件都可以用普通的@Inject 注入。

我遇到的唯一缺点是,没有使 Jersey 组件成为 Spring @Component,当您想要注入属性值时它不支持 @Value

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

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

更新

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


1 - InjectionResolver 允许您使用自定义注解来创建注入目标。

【讨论】:

    【解决方案2】:

    当您删除 @Component jersey 时,将控制实例的范围。使用 @Component 创建一个单例实例,删除它可以使用以下球衣注释:

    • 请求范围(默认): 通过使用@RequestScope 注释或不使用,我们可以拥有一个生命周期,直到 请求持续。这是根资源类的默认范围。为了 每个新请求,都会创建和服务一个新的根资源实例 因此,第一次。但是,当相同的根资源方法 正在调用,则旧实例将用于处理请求。

    • 每个查找范围: @PerLookup 注解为每个请求创建根资源实例。

    • 单例: @Singleton 注解允许我们只创建一个实例 在整个应用程序中。


    使用类中的计数器尝试不同的行为...

    public class MyWebResource {
    private int counter;
    
    @GET
    @Path("/counter")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getCounter() {
        counter++;
        return Response.status(Status.OK).entity(counter).build();
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-23
      • 2015-06-21
      • 2017-02-19
      • 2014-06-27
      • 2020-05-23
      • 1970-01-01
      • 2019-03-29
      相关资源
      最近更新 更多