我刚刚开始使用Spring Boot,我想实现一个ResourceConfig,我发现了一些相互矛盾的想法。
采取以下
@Component
public class JerseyExampleConfig extends ResourceConfig {
以上用COMPONENT注释
@Configuration
public class JerseyExampleConfig extends ResourceConfig {
哪一个是正确的?
我认为使用Configuration进行注释将是正确的方法,但似乎在示例中使用了Component。
有什么想法吗?
区别是什么?
答案 0 :(得分:2)
documentation建议@Component
:
要开始使用Jersey 2.x,只需将
spring-boot-starter-jersey
作为依赖项包含在内,然后您需要一个类型为@Bean
的{{1}}注册所有端点:ResourceConfig
documentation还说明了以下内容:
您还可以注册实现
@Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(Endpoint.class); } }
的任意数量的bean,以进行更高级的自定义。所有已注册的端点都应为
ResourceConfigCustomizer
s,其中包含HTTP资源注释(@Component
等),例如@GET
由于
@Component @Path("/hello") public class Endpoint { @GET public String message() { return "Hello"; } }
是一个SpringEndpoint
,它的生命周期由Spring管理,你可以@Component
依赖,并使用@Autowired
注入外部配置。 Jersey servlet将被注册并默认映射到@Value
。您可以通过将/*
添加到@ApplicationPath
来更改映射。
答案 1 :(得分:1)
因此,即使您无法决定使用哪个JerseyConfig
,您也可以通过阅读其实际含义来确定哪种情况更好:
@Configuration表示一个类声明了一个或多个@Bean 方法并且可以由Spring容器处理以生成bean 运行时那些bean的定义和服务请求
@Component表示带注释的类是“组件”。这样 在使用时,类被视为自动检测的候选者 基于注释的配置和类路径扫描。
@Configuration因此使用@Component进行元注释 @Configuration类是组件扫描的候选者
因此,通过上述说法,您可以使用@Configuration
注释您的配置类,但这将是一个不必要的开销。
答案 2 :(得分:1)
他们都使ResourceConfig
成为一个Spring Bean,这是使Spring Boot-Jersey集成工作真正需要的全部功能。你甚至可以做到
@SpringBootApplication
class MyApplication {
public static void main(String... args) {}
@Bean
public ResourceConfig jerseyConfig() {
return new MyResourceConfig();
}
}
这样,您就不需要@Component
或@Configuration
。它简单地使ResourceConfig
成为一个Spring Bean,就像我说的那样,只需要它。
话虽如此,在两个注释之间,@Configuration
实际上是用于Spring配置。你可以将你的Spring配置放在ResourceConfig
子类中,但我只是将它放在一个单独的配置类中,只是为了保持分离。请注意,配置类也是Spring Beans,这就是@Configuration
工作的原因。
@Component
是一个通用的注释,它将使类成为一个Spring Bean。这就是所有示例都使用注释的原因,因为ResourceConfig
通常不是Spring配置类,并且它比上面的示例更简洁,不使用任何注释。