springboot---(下)

121 阅读1分钟

注册web的filter组件

回顾: web开发--如何定义过滤器以及如何把过滤注册到web.xml容器中。

public class 类名 implements java.servlet.Filter{

doFilter(){}

}

<filter>

<filter-name></filter-name>

<filter-class></filter-class>

</filter>

<filter-mapping>

<filter-name></filter-name>

<url-paterrn></

</filter-mapping>

springboot中不存在web.xml文件。---使用@Configuration注解,等价于xml文件

创建一个过滤器类

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //校验是否登录,编码等等
        System.out.println("经过了该过滤器");
        filterChain.doFilter(servletRequest,servletResponse);//放行到下一个过滤器,或者到达请求的地址controller
    }
}

配置类

@Bean
public FilterRegistrationBean<Filter> filterFilterRegistrationBean(){
    FilterRegistrationBean<Filter> filter = new FilterRegistrationBean<>();
    filter.setName("myFilter");
    filter.setFilter(new MyFilter());
    filter.addUrlPatterns("/*");
    return filter;
}

springboot自动装配原理

springboot自动包扫描

springboot默认扫描的包是哪些?

主类所在的包以及子包。---为什么是这样? 能不能人为改动?

一定在主类上的@SpringBootApplication上

image.png

image.png

image.png

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
//注册扫描的包---getPackageNames得到要扫描的包名。--默认为主类所在的包
    AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}

我们可以在主类上使用@ComponentScan来修改默认的包扫描

@ComponentScan(basePackages = {"扫描的路径"})  //使用这个注解之后,扫描的路径就会变成这个

image.png

自动装配原理

springboot 没有注册DispatcherServlet前端控制器. 为何能找到controller层。

<!--注册DispatchServlet-->
<servlet>
 <servlet-name>springmvc</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 <!--如果没有指定参数默认解析WEB-INF/servlerName-servlet.xml-->
 <init-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath*:spring.xml</param-value>
 </init-param>
</servlet>
<servlet-mapping>
 <servlet-name>springmvc</servlet-name>
 <url-pattern>/</url-pattern>
</servlet-mapping>

springboot帮你完成自动装配

image.png

image.png

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    } else {
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        configurations = this.removeDuplicates(configurations);
        Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
        this.checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = this.getConfigurationClassFilter().filter(configurations);
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    }
}

image.png

image.png

当主函数运行时会加载一个使用@SpringBootApplication注释的类,@SpringbootApplication它是一个复合组件。其中@EnableAutoConfiguration它是开启自动配置的核心注解,该注解也是一个复合组件,其中@Import({AutoConfigurationImportSelector.class}) ,该注解需要导入一个AutoConfigurationImportSelector类,该类会加载你需要的自动装配类,而这些自动装配类会完成响应的自动装配功能。