springboot11:原生组件注入

一.注入三大组件

1.servlet API注入(即可处理)–没有经过springmvc的拦截器

  • @WebServlet(urlPatterns=“/my”)
    public class Myservlet extends HttpServlet
    重写doGet方法

  • 还需要在主配置类中加入@ServletComponentScan(要扫描的包)指定原生servlet组件放在哪, 会自动扫描我们加入的servlet组件

2.Fileter注入

  • @WebFileter(urlPatterns=“/my”)
    public class MyFilter implements Filter
    重写doFilter方法

3.listenr注入

  • @WebListener
    public class listenr implements ServletContextListener
    重写ContextInitialized(监听项目初始化)

4.使用其他注解@Configuration

@Configuration
public class MyRegistConfig {

    @Bean
    public ServletRegistrationBean myServlet(){
        MyServlet myServlet = new MyServlet();
        return new ServletRegistrationBean(myServlet,"/my","/my02");
    }


    @Bean
    public FilterRegistrationBean myFilter(){

        MyFilter myFilter = new MyFilter();
//        return new FilterRegistrationBean(myFilter,myServlet());
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
        filterRegistrationBean.setUrlPatterns(Arrays.asList("/my","/css/*"));
        return filterRegistrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean myListener(){
        MySwervletContextListener mySwervletContextListener = new MySwervletContextListener();
        return new ServletListenerRegistrationBean(mySwervletContextListener);
    }
}

二.为什么servlet不会被Filter过滤

1.DispacherServlet如何注册到bean

  • 给容器中直接放一个DispacherServlet(属性绑定的对应配置文件的配置项为spring.mvc.xx)
  • 后面通过ServletRegistrationBean 把原生的DIspacherServlet注册进来
  • 即绑定解决什么路径(默认映射路径“/”)
  • 以前原生tomcat-servlet多个servlet都能处理到同一层路径,精确优先原则
  • 即我们配置了新的servlet后路径为/my,即如果为my则进入我们配置的serlvet

三.嵌入式servlet容器

1.servlet服务器启动

  • springboot应用启动,发现当时是web应用,web场景包中有tomcat
  • web应用创建一个web版IOC容器,此容器的名字为SevletWebServerApplicationContext
  • 该容器会在项目启动过程中搜索SerlvetWebServerFactory (Servletweb服务器工厂----》serlvetweb服务器)
  • springboot默认支持很多web服务器
    • TomcatServletWebServerFactory, JettyServletWebServerFactory, or UndertowServletWebServerFactory
  • 底层直接会有一个自动配置类。ServletWebServerFactoryAutoConfiguration
  • 自动配置类导入了ServletWebServerFactoryConfiguration(配置类)
  • ServletWebServerFactoryConfiguration 配置类 根据动态判断系统中到底导入了那个Web服务器的包。(默认是web-starter导入tomcat包),容器中就有 TomcatServletWebServerFactory
  • TomcatServletWebServerFactory 创建出Tomcat服务器并启动;TomcatWebServer 的构造器拥有初始化方法initialize—this.tomcat.start();
  • 内嵌服务器,就是手动把启动服务器的代码调用(tomcat核心jar包存在)

2.定制servlet服务器启动

  • 在依赖stater-web中排除tomcat的依赖
  • 加入其他服务器到的场景引入
<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-webartifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-tomcatartifactId>
        exclusion>
    exclusions>
dependency>

3.改动端口字符编码

  • 修改配置文件(推荐)
  • 直接自定义 ConfigurableServletWebServerFactory
  • WebServerFactoryCustomizer
    • 把配置文件的值和ServletWebServerFactory 进行绑定

四.定制化原理

1.定制化常见方式

  • 场景starter - xxxxAutoConfiguration - 导入xxx组件 - 绑定xxxProperties – 绑定配置文件项

2.深入定制化

  • 配置@configuration自定义配置类 来@bean
  • 修改配置文件
  • xxxcustomizer 定制化web容器
  • 用的多 (掌握)
    • 写一个配置类,实现WebMvcConfigure+@Bean扩展组件
    • 在类中定制(重写方法)
  • 使用@EnableWebMvc全面接管mvc(WebMvcConfigure),容器中会执行下面的方法,并且导入WebMvcConfigureSupport类
    • 注意:把所有系统的WebMvcConfigure都拿过来,所有功能的定制都是这些WebMvcConfigure一起生效,只保证springmvc基本的使用
    • 而webmvcConfigurartion里面的配置生效,必须保证容器中没有WebMvcConfigureSupport

你可能感兴趣的:(SprignBoot,servlet,java,tomcat)