Spring Boot 之 Server 的那些事

Spring Boot源码版本为2.2.7

0x01.修改默认的Server配置

  • Spring Boot内嵌了tomcat,并且进行了一些自动配置,如果需要修改,只需在配置文件中进行相关的配置即可。

例如:

#端口号
server.port=8081
#指定编码
server.tomcat.uri-encoding=UTF-8

#通用的Servlet容器设置
server.xxx
#Tomcat的设置
server.tomcat.xxx

0x02.自定义嵌入式的 Servlet 容器

  • 我们可以通过编写一个EmbeddedServletContainerCustomizer:嵌入式的Servlet容器的定制器;来自定义的修改Servlet容器的配置。
@Bean //将定制器加入到容器中
public WebServerFactoryCustomizer webServerFactory() {
    return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
        //定制嵌入式的Servlet容器相关的规则
        @Override
        public void customize(ConfigurableServletWebServerFactory factory) {
            factory.setPort(8088);
        }
    };
}

0x03.三大组件的整合(Servlet、Filter、Listener)

  • 由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用,没有web.xml文件。所以需要自己编写组件并注册到容器中。

注册Servlet:

  • 编写一个Servlet:
public class MySevlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter().write("自定义Servlet已执行");
    }
}

  • 在Server的配置类中注册:
@Configuration
public class MyServerConfig {
    @Bean
    public ServletRegistrationBean myServlet() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new MySevlet(), "/SelfServlet");
        // 设置启动顺序
        registrationBean.setLoadOnStartup(1);
        return registrationBean;
    }
}

注册 Filter:

  • 编写一个Filter。
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter已执行!!!");
        // 放行请求
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }
}
  • 在Server的配置类中注册:
@Bean
public FilterRegistrationBean myFilter() {
    FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
    // 设置filter
    filterRegistrationBean.setFilter(new MyFilter());
    // 设置拦截uri的路径
    filterRegistrationBean.setUrlPatterns(Arrays.asList("/main", "/filter"));
    return filterRegistrationBean;
}

注册 Listener:

  • 编写一个Listener:
public class MyListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("正在监听--服务器开启");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("正在监听--服务器关闭");
    }
}


  • 在Server的配置类中注册:
@Bean
public ServletListenerRegistrationBean myListener() {
    ServletListenerRegistrationBean<MyListener> registrationBean =
            new ServletListenerRegistrationBean<>(new MyListener());
    return registrationBean;
}

0x04.使用外置的Servlet容器

  • 嵌入式Servlet容器是将应用打成可执行的jar包。缺点是默认不支持JSP、优化定制比较复杂。(使用定制器,自己编写嵌入式Servlet容器的创建工厂)
  • 外置的Servlet容器是在外面安装Tomcat—应用war包的方式打包;
  • 使用外置Servlet容器时,需要在创建项目时,采用war包的方式。
    在这里插入图片描述
  • 第一步,在pom.xml将嵌入式的Tomcat指定为provided;
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>
  • 第二步,配置外部的tomcat;

在这里插入图片描述

  • 第三步,编写一个SpringBootServletInitializer的子类,并调用configure方法。
public class ServletInitializer extends SpringBootServletInitializer {

   @Override
   protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       //传入SpringBoot应用的主程序
      return application.sources(SpringBoot04WebJspApplication.class);
   }

}
  • 第四步,正常启动服务器就ok了。

ATFWUS --Writing By 2020–04-30

原创文章 248 获赞 288 访问量 4万+

猜你喜欢

转载自blog.csdn.net/ATFWUS/article/details/105866056
今日推荐