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

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

一、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对三大组件的扫描与自动配置
目录
打赏
0
0
0
0
0
分享
相关文章
Springboot静态资源映射及文件映射
在Spring Boot项目中,为了解决前端访问后端存储的图片问题,起初尝试通过静态资源映射实现,但发现这种方式仅能访问打包时已存在的文件。对于动态上传的图片(如头像),需采用资源映射配置,将特定路径映射到服务器上的文件夹,确保新上传的图片能即时访问。例如,通过`addResourceHandler(&quot;/img/**&quot;).addResourceLocations(&quot;file:E:\\myProject\\forum_server\\&quot;)`配置,使前端可通过URL直接访问图片。
Springboot静态资源映射及文件映射
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
58 0
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
63 17
springboot自动配置原理
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
79 0
SpringBoot自动配置及自定义Starter
Java程序员依赖Spring框架简化开发,但复杂的配置文件增加了负担。SpringBoot以“约定大于配置”理念简化了这一过程,通过引入各种Starter并加载默认配置,几乎做到开箱即用。
120 10
SpringBoot自动配置及自定义Starter
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
SpringBoot配置跨模块扫描问题解决方案
在分布式项目中,使用Maven进行多模块开发时,某些模块(如xxx-common)没有启动类。如何将这些模块中的类注册为Spring管理的Bean对象?本文通过案例分析,介绍了两种解决方案:常规方案是通过`@SpringBootApplication(scanBasePackages)`指定扫描路径;推荐方案是保持各模块包结构一致(如com.xxx),利用SpringBoot默认扫描规则自动识别其他模块中的组件,简化配置。
SpringBoot配置跨模块扫描问题解决方案
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
155 14
|
3月前
|
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
156 1
SpringBoot入门(7)- 配置热部署devtools工具
|
3月前
|
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
67 2
 SpringBoot入门(7)- 配置热部署devtools工具