![](/img/trans.png)
[英]Purpose of @Component annotation on spring-boot-starter-jersey resources in Spring boot
[英]Why do we need @Component spring annotation for Jersey resource in spring-boot-starter-jersey project?
這個問題與樣本有關: 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”的需求是什么?
你不需要它。 Jersey使用HK2作為內部DI框架,HK2使用Spring橋 。 這是內部用於將Spring組件橋接到HK2 IoC容器中的內容,因此可以將它們注入到Jersey組件中。 而Jersey實現了一個AutowiredInjectionResolver
1 ,允許使用@Autowired
注入Spring組件。 你甚至不需要@Autowired
。 所有Spring組件都可以使用普通的@Inject
注入。
我遇到的唯一缺點是,沒有使Jersey組件成為Spring @Component
,當你想要注入屬性值時它不支持@Value
。
我不喜歡的一件事是,當你聲明一個Spring @Component
,它會自動使它成為一個單例。 但澤西資源默認是請求作用域。 您可以添加Spring @Scope("request")
,它應該將資源更改為請求范圍的資源。 Jersey 宣布了Spring RequestScope ,因此我們可以使用它。 究竟它與澤西島的要求范圍有什么關系,我不是百分百肯定的。 我不久前遇到了一個問題。 我不記得它是什么,但這使我不再使用Spring請求范圍。
假設我想保留我的所有資源請求范圍,我會堅持正常的Jersey請求范圍,並且無法注入@Value
s,而不必使用Spring的請求范圍。 也許我想象的事情,並且有使用它沒有問題,但我個人就堅持什么,我知道作品:-)
如果不將資源設置為Spring @Component
那么另一件事就是無法工作的是Spring的AOP。 雖然HK2也有AOP,但對我來說沒關系。
1 - InjectionResolver允許您使用自定義注釋來創建注入目標。
當你刪除@Component時,jersey會控制實例的范圍。 使用@Component創建一個單例實例,刪除它可以使用以下澤西注釋:
•請求范圍(默認):通過使用@RequestScope注釋或無,我們可以有一個生命周期,直到請求持續。 這是根資源類的默認范圍。 對於每個新請求,首次創建並相應地提供新的根資源實例。 但是,當調用相同的根資源方法時,舊實例將用於提供請求。
•每個查找范圍:@PerLookup批注為每個請求創建根資源實例。
•Singleton:@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();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.