为什么我们需要" @Component"使用spring-boot -starter-jersey项目时Jersey资源的注释?
如果删除它,Jersey servlet仍然可以提供资源。
那么" @Component"?
需要什么?答案 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();
}
}