IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Springboot -> 正文阅读

[Java知识库]Springboot

学习还是推荐去看狂神的博客,那边很详细

Springboot入门

pom.xml

  • 新建项目就有的,springboot为我们简约了非常多的配置,甚至是版本,都是自动管理的,我们导入依赖时不需要指定版本,直接从父pom继承。
  • pom.xml包含了一个个starter启动器,开启了一个启动器,就会把相关依赖全部导入。官方提供的starters
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.springboot-study</groupId>
    <artifactId>springboot-01-helloworld</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-01-helloworld</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Springboot原理(自动装配)

这个图不太清晰,我的proscesson绘图链接在这在这里插入图片描述

springboot怎么启动的:(图中第一部分)

如图所示,这个注解一直可以找到spring.factories,说明启动时,加载了这个文件中的配置,至于这么多配置,为什么只加载了一部分,就是使用了注解EnableAutoConfiguration,只有满足了条件才会加载,(这里感觉 就是starter!看视频好像有点模糊)

@SpringBootApplication
public class Springboot01HelloworldApplication {
    public static void main(String[] args) {
        SpringApplication.run(Springboot01HelloworldApplication.class, args);
    }
}

这里的注解标记了这个类是个springboot应用,main函数SpringApplication的run方法会启动一个新的线程运行程序。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
...
...

springboot中的自动配置(图中第二部分)

  • springboot能够自动装配的在spring-boot-autoconfigure资源的MATA-INF/spring.factories下,有很多对应的xxxAutoConfiguration,从这里对应了每个自动配置的类,比如WebMvcAutoConfiguration.class(狂神视频里版本不一样,他的是.java)
  • 从WebMvcAutoConfiguration.class 里继续找到WebProperties.class,这里的属性就是对应了yaml可以配置的属性,配置yaml时都会自动提示。

以上主要就是yaml配置,xxxAutoConfiguration和xxxProperties的关系。

Springboot web开发

静态资源(js css image)放在哪? 看源码分析!

  • 首先,我们要确定从哪开始找:我们要找的时web开发的 ,找WebMvcAutoConfiguer.class
  • 搜resource 看看相关的函数
 public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
            } else {
                this.addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
                this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
                    registration.addResourceLocations(this.resourceProperties.getStaticLocations());
                    if (this.servletContext != null) {
                        ServletContextResource resource = new ServletContextResource(this.servletContext, "/");
                        registration.addResourceLocations(new Resource[]{resource});
                    }
                });
            }
        }

找到了添加资源处理器函数:
isAddMappings,如果开发者自定义了一个resourceProperties的映射,默认的资源处理器就会失效。否则,
1、将路径"/webjars"映射为"classpath:/META-INF/resources/webjars/"。
2、添加getStaticLocations返回的的路径,这里干了啥 要到this.resourceProperties看了。

public static class Resources {
		//私有静态变量,这里的顺序  是按照优先级设置的, 所以如果这四个不同的路径下有相同的资源,不会报错,而是按照这个顺序加载,越靠前优先级越高。
        private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[]{"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"};
        private String[] staticLocations;
        private boolean addMappings;
        private boolean customized;
        private final WebProperties.Resources.Chain chain;
        private final WebProperties.Resources.Cache cache;
		//无参的构造方法
        public Resources() {
        	//创建对象时设置属性
            this.staticLocations = CLASSPATH_RESOURCE_LOCATIONS;
            this.addMappings = true;
            this.customized = false;
            this.chain = new WebProperties.Resources.Chain();
            this.cache = new WebProperties.Resources.Cache();
        }
		//getStaticLocations返回StaticLocations  4个,
        public String[] getStaticLocations() {
            return this.staticLocations;
        }

首页放在哪? 看源码分析~(也看webmvc的)

(1)、这里的classpath: 就是resources和java,可以通过分析target/classes分析得到。

(2)、平时不太喜欢看英文,但是这里源码连英文注释都没有,找源码函数先凭感觉搜 比如index welcome可能和首页相关

//这里使用了几个重载的方法,之间互相调用
private Resource getWelcomePage() {
   String[] var1 = this.resourceProperties.getStaticLocations();
   int var2 = var1.length;
   /*
   从
   "classpath:/META-INF/resources/"
   "classpath:/resources/"
   "classpath:/static/"
   "classpath:/public/"
   这几个路径下去找
   */
   for(int var3 = 0; var3 < var2; ++var3) {
       String location = var1[var3];
       Resource indexHtml = this.getIndexHtml(location);
       if (indexHtml != null) {
           return indexHtml;
       }
   }
   ServletContext servletContext = this.getServletContext();
   if (servletContext != null) {
       return this.getIndexHtml((Resource)(new ServletContextResource(servletContext, "/")));
   } else {
       return null;
   }
}
private Resource getIndexHtml(String location) {
   return this.getIndexHtml(this.resourceLoader.getResource(location));
}
private Resource getIndexHtml(Resource location) {
   try {
   		//这里告诉了我们首页的名字
       Resource resource = location.createRelative("index.html");
       if (resource.exists() && resource.getURL() != null) {
           return resource;
       }
   } catch (Exception var3) {
   }
   return null;
}
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:17:51  更:2022-03-10 22:21:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 10:54:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码