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

时间:2016-06-30 21:36:33

标签: 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

为什么我们需要" @Component"使用spring-boot -starter-jersey项目时Jersey资源的注释?

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

那么" @Component"?

需要什么?

2 个答案:

答案 0 :(得分:2)

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

我遇到的唯一一个缺点就是当你想要注入属性值时,它不支持@Component

不喜欢之类的一件事是当你宣布一个Spring @Value时,它会自动使它成为一个单身人士。但泽西资源默认是请求作用域。您可以添加Spring @Component,它应该将资源更改为请求范围的资源。泽西岛有declared the Spring RequestScope,所以我们可以使用它。究竟它与泽西岛的要求范围有什么关系,我不是百分百肯定的。我不久前遇到了一个问题。我不记得它是什么,但这使我不再使用Spring请求范围。

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

更新

如果你不将资源变成Spring @Value,那么另一件事就不行了就是Spring的AOP。虽然HK2也有AOP,但对我来说没问题。

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

答案 1 :(得分:0)

删除@Component时,jersey会控制实例的范围。使用@Component创建一个单例实例,将其删除即可使用以下泽西注释:

•请求范围(默认): 通过使用@RequestScope注释或无,我们可以有一个生命周期直到 请求持续。这是根资源类的默认范围。对于 每个新请求,正在创建和提供新的根资源实例 因此是第一次。但是,当使用相同的root-resource方法时 正在调用,然后旧实例将用于提供请求。

•每个查找范围: @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();
}

}