簡體   English   中英

為什么我們需要在spring-boot-starter-jersey項目中為Jersey資源提供@Component spring注釋?

[英]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的請求范圍。 也許我想象的事情,並且使用它沒有問題,但我個人就堅持什么,我知道作品:-)

UPDATE

如果不將資源設置為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM