美文网首页
[原创]SpringBoot配置、自动配置原理、静态资源访问

[原创]SpringBoot配置、自动配置原理、静态资源访问

作者: 垃圾简书_吃枣药丸 | 来源:发表于2019-10-29 14:15 被阅读0次

    一、SpringBoot配置

    1. @ConfigurationProperties 与 @Value

    @ConfigurationProperties @Value
    功能 批量注入,注解打在类上 一个一个字段绑定,注解打在字段上
    松散绑定,松散语法user_name->userName 支持 不支持
    SPEL(#(1+1),true) 不支持 支持
    JSR303@Validated 支持 不支持
    复杂类型封装(map,list) 支持 不支持

    2. @PropertySource("classpath:person.properties")

    因为项目的配置比较多,所以不可能都写在application.yml中,有时需要写在其他配置文件中,如person.properties文件,则在进行属性注入(@ConfigurationProperties)的时候,需要指定配置文件的路径。

    3. @ImportResource(locations="classpath:beans.xml")

    在传统的xml_Spring项目中,其他的spring配置文件需要通过<import ...>导入到applicationContext.xml中才能被spring读取到,而在SpringBoot项目中是通过@ImportResource()注解导入到Spring容器中.

    4. 配置文件占位符

    • 随机数 ${random.value},${random.uuid}
    • 获取之前配置的值,没有则使用默认值person.name=${app.name:张三}_dog

    5. 配置文件配置与优先级(从高到低,高优先级会覆盖低优先级)

    • file: ./config/
    • file: ./
    • classpath: /config/
    • classpath: /

    6. SpringBoot自动配置原理

    • @SpringBootApplication
    • EnableAutoConfiguration
    • @Import(AutoConfigurationImportSelector.class)
    • selectImports()->getAutoConfigurationEntry( autoConfigurationMetadata, annotationMetadata)
    • getAutoConfigurationEntry()->getCandidateConfigurations(annotationMetadata, attributes)
    • getCandidateConfigurations()->SpringFactoriesLoader.loadFactoryNames( getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())
    • loadFactoryNames()->loadSpringFactories()
    • loadSpringFactories()->加载META-INF/spring.factories文件
    • 从配置文件中读取以EnableAutoConfiguration.class类路径为key的值,即可以得到springboot的所有自动配置类的路径.
    protected Class<?> getSpringFactoriesLoaderFactoryClass() {
            return EnableAutoConfiguration.class;
        }
    
    image.png image.png
    • 有了自动配置类路径,接下来加载这些自动配置类,即完成了组件的自动注入(到IOC容器中)
    • eg: HttpEncodingAutoConfiguration.class
    @Configuration  //标识这个一个配置类,可以用来配置Bean
    @EnableConfigurationProperties(HttpProperties.class)  // 启用HttpProperties.class类的`@ConfigurationProperties(prefix = "spring.http")`注解,将配置文件与配置类进行注入与绑定
    @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
    @ConditionalOnClass(CharacterEncodingFilter.class)   //当类路径下存在`CharacterEncodingFilter.class`这个类时
    @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)  //spring.http.encoding.enabled=true是否存在某个配置,如果不存在默认也是生效的
    public class HttpEncodingAutoConfiguration {
    //上述条件全部成立,则会加载这个配置类下所有配置好的Bean
    ...
    }
    
    • 自动配置类都在spring-boot-autoconfigure项目下,类名为XXXXAutoConfiguration,当你的SpringBoot项目添加了相关的依赖,满足了配置类上所有的Condition,那么Spring就会加载这个组件。实现了:使得SpringBoot具有了添加某项依赖就有了可以直接使用某项功能的能力

    二、SpringBoot对静态资源的映射规则

    • SpringBoot对Web的支持都在WebMvcAutoConfiguration.class配置类
    1. webjars
    image.png
    • webjars: 以jar包的形式引入静态资源,如js,css,jQuery等
      • 添加依赖
              <dependency>
                <groupId>org.webjars.bower</groupId>
                <artifactId>jquery</artifactId>
                <version>3.4.1</version>
            </dependency>
      
      • image.png
      • 请求资源,访问/webjars/jquery/3.4.1/dist/jquery.js
    1. 自定义的资源
      this.resourceProperties.getStaticLocations()为:
    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
                "classpath:/META-INF/resources/", "classpath:/resources/",
                "classpath:/static/", "classpath:/public/" };
    

    即,/**请求任何路径都会到CLASSPATH_RESOURCE_LOCATIONS下进行资源的查找。
    因为WebMvcAutoConfiguration类已经进行了上述两个配置,所以可以直接进行使用。

    三、注册三大组件Servlet, Filter, Listener

    1. 第一种方式,通过xxxRegistrationBean<>注册

    • 通过ServletRegistrationBean<>注册Servlet
    • 通过FilterRegistrationBean<>注册Filter
    • 通过ServletListenerRegistrationBean<>注册Listener

    eg. Servlet

        @Bean
        public ServletRegistrationBean<AServlet> aServletRegistrationBean() {
            return new ServletRegistrationBean<>(new AServlet(), "/aServlet");
        }
    

    DispatcherServlet就是通过这种方式注册的

    2. Servlet 3.0+ 通过注解方式

    • 在Servlet上打注解@WebServlet

    • 在Filter上打注解@WebFilter

    • 在Listener上打注解@WebListener

    • 再通过@ServletComponentScan注解开启SpringBoot对三大组件的扫描与自动配置

    相关文章

      网友评论

          本文标题:[原创]SpringBoot配置、自动配置原理、静态资源访问

          本文链接:https://www.haomeiwen.com/subject/jyswvctx.html