[原创]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对三大组件的扫描与自动配置
相关文章
|
9天前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
12天前
|
Java 应用服务中间件 API
Vertx高并发理论原理以及对比SpringBoot
Vertx 是一个基于 Netty 的响应式工具包,不同于传统框架如 Spring,它的侵入性较小,甚至可在 Spring Boot 中使用。响应式编程(Reactive Programming)基于事件模式,通过事件流触发任务执行,其核心在于事件流 Stream。相比多线程异步,响应式编程能以更少线程完成更多任务,减少内存消耗与上下文切换开销,提高 CPU 利用率。Vertx 适用于高并发系统,如 IM 系统、高性能中间件及需要较少服务器支持大规模 WEB 应用的场景。随着 JDK 21 引入协程,未来 Tomcat 也将优化支持更高并发,降低响应式框架的必要性。
Vertx高并发理论原理以及对比SpringBoot
|
9天前
|
Java Spring
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
22天前
|
Java 开发者 数据格式
【Java笔记+踩坑】SpringBoot基础4——原理篇
bean的8种加载方式,自动配置原理、自定义starter开发、SpringBoot程序启动流程解析
【Java笔记+踩坑】SpringBoot基础4——原理篇
消息中间件 缓存 监控
81 0
|
1月前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
87 5
|
2月前
|
安全 前端开发 Java
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
在Web安全上下文中,源(Origin)是指一个URL的协议、域名和端口号的组合。这三个部分共同定义了资源的来源,浏览器会根据这些信息来判断两个资源是否属于同一源。例如,https://www.example.com:443和http://www.example.com虽然域名相同,但由于协议和端口号不同,它们被视为不同的源。同源(Same-Origin)是指两个URL的协议、域名和端口号完全相同。只有当这些条件都满足时,浏览器才认为这两个资源来自同一源,从而允许它们之间的交互操作。
Web端系统开发解决跨域问题——以Java SpringBoot框架配置Cors为例
|
2月前
|
缓存 前端开发 Java
"揭秘!SpringBoot携手Nginx,性能飙升秘籍大公开:轻松掌握配置优化,让你的应用快如闪电!"
【8月更文挑战第11天】随着微服务架构的发展,SpringBoot成为构建RESTful API的首选,Nginx则作为高性能的反向代理服务器提升应用性能。本文将探讨两者如何协同工作,包括Nginx的负载均衡策略、静态资源缓存及数据压缩配置;同时讨论SpringBoot的线程池优化、缓存策略及性能监控。通过这些方法,帮助开发者显著提高系统的整体性能和可用性。
80 1
|
2月前
|
Java Spring 开发者
解锁 Spring Boot 自动化配置的黑科技:带你走进一键配置的高效开发新时代,再也不怕繁琐设置!
【8月更文挑战第31天】Spring Boot 的自动化配置机制极大简化了开发流程,使开发者能专注业务逻辑。通过 `@SpringBootApplication` 注解组合,特别是 `@EnableAutoConfiguration`,Spring Boot 可自动激活所需配置。例如,添加 JPA 依赖后,只需在 `application.properties` 配置数据库信息,即可自动完成 JPA 和数据源设置。这一机制基于多种条件注解(如 `@ConditionalOnClass`)实现智能配置。深入理解该机制有助于提升开发效率并更好地解决问题。
49 0
|
2月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
35 0
下一篇
无影云桌面