当前位置: 首页 > 科技观察

SpringBoot对SpringMVC做了什么?(4)_0

时间:2023-03-14 10:28:09 科技观察

环境:Springboot2.4.12上一篇:《??SpringBoot对Spring MVC都做了哪些事?(三)??》JAX-RS(Jersey)SupportJAX-RS是JAVAEE6引入的新技术。JAX-RS,JavaAPIforRESTfulWebServices,是支持创建符合具象状态传输(REST)架构风格的Web服务的Java编程语言的应用编程接口。JAX-RS使用JavaSE5引入的Java注释来简化Web服务客户端和服务器的开发和部署。JerseyRESTfulWeb服务框架是一个开源的、生产质量的框架,用于在Java中开发RESTfulWeb服务,它提供对JAX-RSAPI的支持并作为JAX-RS(JSR311和JSR339)参考实现。Jersey框架不仅仅是一个JAX-RS参考实现。Jersey提供了自己的API,它使用附加功能和实用程序扩展JAX-RS工具包,以进一步简化RESTful服务和客户端开发。如果您更喜欢REST端点的JAX-RS编程模型,可以使用一种可用的实现来代替SpringMVC。Jersey和ApacheCXF开箱即用。CXF要求您在应用程序上下文中将其servlet或过滤器注册为@Bean。Jersey有一些原生的Spring支持,所以我们也在SpringBoot中为它提供自动配置支持,以及一个启动器。简单的说,如果你只是想使用JAX-RS,那么SpringBoot为其提供了自动配置支持。SpringBoot中使用的流程:引入依赖org.springframework.bootspring-boot-starter-jerseycustomEndpoint@Component@Path("/hello")publicclassEndpoint{@GETpublicStringmessage(){return"Hello";}}资源配置@ComponentpublicclassJerseyConfigextendsResourceConfig{publicJerseyConfig(){register(Endpoint.class);}}以上配置完成后,可以通过http://xxx:port/hello实现方法接口。因为端点是一个Spring@Component,其生命周期由Spring管理,所以您可以使用@Autowired注解注入依赖项,使用@Value注解注入外部配置。默认情况下,Jerseyservlet已注册并映射到/*。您可以通过将@ApplicationPath添加到ResourceConfig来更改映射。@Component//访问路径:http://xxx:port/api-a/hello@ApplicationPath("/api-a")publicclassJerseyConfigextendsResourceConfig{publicJerseyConfig(){register(Endpoint.class);}}Servlets,Filters,Listeners当使用一个嵌入式servlet容器时,你可以通过使用Springbeans或者扫描Servlet组件来注册Servlets,Filters和所有来自Servlet规范的Listener(比如HttpSessionListener)。任何作为Springbean的Servlet、Filter或Servlet*Listener实例都在嵌入式容器中注册。如果您想在应用程序中引用一个值,这会很方便。在配置属性中。默认情况下,如果上下文只包含一个servlet,它将被映射到/。在多个servletbean的情况下,bean名称用作路径前缀。过滤器映射到/*。这是什么意思,看下面的例子:@ConfigurationpublicclassServletConfig{@BeanpublicServlet1s1(){returnnewServlet1();}//如果没有定义访问路径,则使用bean的名字作为访问路径//http://xxx:port/servlet1@BeanpublicServletRegistrationBeanservlet1(Servlet1s1){ServletRegistrationBeanservlet=newServletRegistrationBean<>(s1);返回小服务程序;,过滤器,听众。通常,让Filterbean处于无序状态是安全的。如果需要特定的顺序,您应该使用@Order注释过滤器,或者让它实现Ordered。您不能通过使用@Order注释其bean方法来配置过滤器的顺序。如果您无法更改Filter类以添加@Order或实现Ordered,那么您必须为Filter定义一个FilterRegistrationBean并使用setOrder(int)方法设置注册bean的顺序。避免在Ordered中配置读取请求体的Filter。HIGHEST_PRECEDENCE因为它可能违反应用程序的字符编码配置。如果Servlet过滤器包装请求,那么它应该被配置为小于或等于OrderedFilter.REQUEST_WRAPPER_FILTER_MAX_ORDER的顺序。Servlet上下文初始化嵌入式servlet容器并没有直接实现servlet3.0+javax.servlet.ServletContainerInitializer接口或者Spring的org.springframework.web.WebApplicationInitializer接口。这是一个有意的设计决定,以降低在战争中运行的第三方库可能破坏SpringBoot应用程序的风险。如果您需要在SpringBoot应用程序中执行servlet上下文初始化,您应该注册一个实现org.springframework.boot.web.servlet.ServletContextInitializer接口的bean。单个onStartup方法提供对ServletContext的访问,并且可以在必要时轻松用作现有WebApplicationInitializer的适配器。使用嵌入式容器时,可以使用@ServletComponentScan启用使用@WebServlet、@WebFilter和@WebListener注释的类的自动注册。ServletWebServerApplicationContext在内部,SpringBoot使用不同类型的ApplicationContext来嵌入servlet容器支持。ServletWebServerApplicationContext是一种特殊类型的WebApplicationContext,它通过搜索单个ServletWebServerFactorybean来引导自己。通常TomcatServletWebServerFactory、JettyServletWebServerFactory或UndertowServletWebServerFactory已自动配置。如果您需要以编程方式配置嵌入式servlet容器,您可以注册一个实现WebServerFactoryCustomizer接口的Springbean。WebServerFactoryCustomizerprovidesaccesstoaConfigurableServletWebServerFactorywhichincludesanumberofcustomsettermethods.下面的例子显示了如何通过编程方式设置端口:@ComponentpublicclassCustomizationBeanimplementsWebServerFactoryCustomizer{@Overridepublicvoidcustomize(ConfigurableServletWebServerFactoryserver){server.setPort(9000);}}TomcatServletWebServerFactory,JettyServletWebServerFactory和UndertowServletWebServerFactory是ConfigurableServletWebServerFactory的专用VariantsthatprovideadditionalcustomsettermethodsforTomcat,JettyandUndertowrespectively.以下示例显示如何自定义TomcatServletWebServerFactory以提供对tomcat特定配置选项的访问:@ComponentpublicclassTomcatServerCustomizerExampleimplementsWebServerFactoryCustomizeradd(Connector-Connector).setAsyncTimeout(Duration.ofSeconds(20).toMillis());tomcatConnector.setURIEncoding("UTF-8");tomcatConnector.setPort(8088);});}}