首页 文章

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

提问于
浏览
3

这个问题与样本有关: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”的需求是什么?

2 回答

  • 1

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

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

    我不喜欢的一件事是,当你宣布一个Spring @Component 时,它会自动使它成为一个单例 . 但泽西资源默认是请求作用域 . 您可以添加Spring @Scope("request") ,它应该将资源更改为请求范围的资源 . Jersey 有declared the Spring RequestScope,所以我们可以使用它 . 它究竟与Jersey有什么关系's request scope, I am not a hundred percent sure. I ran into a problem a while back. I can'记住它是什么,但这让我不再使用Spring请求范围 .

    假设我想保留我的所有资源请求作用域,我会坚持正常的Jersey请求范围,并且无法注入 @Value ,而不必使用Spring 's request scope. Maybe I' m想象事物,并且使用它没有问题,但是我个人只会坚持我所知道的工作:-)


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

  • 0

    当你删除@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();
    }
    
    }
    

相关问题