首页 > 其他分享 >2024.12.12(SpringBoot知识点总结)

2024.12.12(SpringBoot知识点总结)

时间:2025-01-10 23:44:26浏览次数:1  
标签:2024.12 知识点 12 ... springframework public web class configurations

3.2 自动配置原理解析
按住Ctrl点击查看启动类MySpringBootApplication上的注解@SpringBootApplication

@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class);
}
}
1
2
3
4
5
6
注解@SpringBootApplication的源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

/**
 * Exclude specific auto-configuration classes such that they will never be applied.
 * @return the classes to exclude
 */
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};

... ... ...

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
其中,

@SpringBootConfiguration:等同与@Configuration,既标注该类是Spring的一个配置类

@EnableAutoConfiguration:SpringBoot自动配置功能开启

按住Ctrl点击查看注解@EnableAutoConfiguration

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
... ... ...
}
1
2
3
4
5
6
7
8
9
其中,@Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类

按住Ctrl点击查看AutoConfigurationImportSelector源码

public String[] selectImports(AnnotationMetadata annotationMetadata) {
... ... ...
List configurations = getCandidateConfigurations(annotationMetadata,
attributes);
configurations = removeDuplicates(configurations);
Set exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
fireAutoConfigurationImportEvents(configurations, exclusions);
return StringUtils.toStringArray(configurations);
}

protected List getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes) {
List configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());

	return configurations;

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
其中,SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Au2l6F2W-1596349973387)(img\11.png)]

spring.factories 文件中有关自动配置的配置信息如下:

... ... ...

org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\

... ... ...
1
2
3
4
5
6
7
8
9
10
上面配置文件存在大量的以Configuration为结尾的类名称,这些类就是存有自动配置信息的类,而SpringApplication在获取这些类名后再加载

我们以ServletWebServerFactoryAutoConfiguration为例来分析源码:

@Configuration
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {
... ... ...
}

1
2
3
4
5
6
7
8
9
10
11
12
13
其中,

@EnableConfigurationProperties(ServerProperties.class) 代表加载ServerProperties服务器配置属性类

进入ServerProperties.class源码如下:

@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {

/**
 * Server HTTP port.
 */
private Integer port;

/**
 * Network address to which the server should bind.
 */
private InetAddress address;

标签:2024.12,知识点,12,...,springframework,public,web,class,configurations
From: https://www.cnblogs.com/yangsongduo/p/18664935

相关文章

  • 2024.12.15(SpringBoot知识点总结)
    4.1.2.2.2配置Map数据同上面的对象写法4.1.2.2.3配置数组(List、Set)数据语法:​key:​-value1​-value2或者:​key:[value1,value2]示例代码:city:beijingtianjinshanghaichongqing或者city:[beijing,tianjin,shanghai,chongqing]集合中的元素是对象形式......
  • 2024.12.16(SpringBoot知识点总结)
    4.2配置文件与配置类的属性映射方式4.2.1使用注解@Value映射我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上例如:application.properties配置如下:person:name:zhangsanage:18123或者,application.yml配置如下:person:name:zhangsanag......
  • 2024.11.12(spring boot创建数据库)
    前端代码UserMapper.xmlselect*fromspringboot.user<selectid="queryUserById"resultType="User"parameterType="int">select*fromspringboot.userwhereid=#{id};</select><insertid="......
  • 124.【C语言】数据结构之快速排序的小区间优化和非递归的解决方法
    目录1.小区间优化测试代码运行结果2.非递归的解决方法(重要!)递归产生的问题一般来说,递归改非递归有两种方法算法分析递归产生的二叉树栈的示意图先写代码框架再填写细节部分1.小区间优化回顾121.【C语言】数据结构之快速排序(未优化的Hoare排序存在的问题)以及......
  • JAVA-Day 12:数组的动态初始化和遍历
    数组的动态初始化和遍历数组的动态初始化格式为:inta[]=newint[10];a[0]=4;a[1]=5;例:for(inti=0;i<2;i++){System.out.println(a[i]);}代码运行结果如下雨所示:![数组的动态初始化运行结果](file://C:\Users\小王同......
  • 12月21日总结
    概念上,树是一种非线性的数据结构,它由节点(node)组成,有一个特殊的节点被称为根节点(root),从根节点开始,通过分支连接子节点,子节点又可以有自己的子节点,如此层层嵌套,形成类似现实世界中树的形状,只不过是倒置的,根节点在最上方。树具有层级性,根节点为第0层,往下依次递增。节点的度(degree)指......
  • 12月23日总结
    今日学习了二叉树的相关操作:一、遍历操作深度优先遍历:前序遍历(根-左-右):递归实现:从根节点开始,首先访问根节点,然后递归地对左子树进行前序遍历,最后递归地对右子树进行前序遍历。示例代码如下(以C语言为例):typedefstructTreeNode{intval;structTreeNode*left;struc......
  • 12月24日总结
    今日踏入数据结构中“图”的奇妙世界,相较于之前学习的线性结构和树结构,图更为复杂且充满多样性,带来了全新的知识挑战与思维拓展。概念上,图由顶点(vertex)和边(edge)组成,顶点代表图中的节点,边则用于连接这些顶点,体现它们之间的关系。根据边是否有方向,图可分为有向图和无向图。有向图......
  • 12月25日总结
    今日主要学习了图的两种遍历方法:深度优先遍历和广度优先遍历深度优先搜索(DFS)include<stdio.h>include<stdlib.h>defineMAX_VERTICES100//图的结构体,使用邻接表存储typedefstructGraph{intnumVertices;structAdjListNode**adjLists;int*visited;}Graph;//......
  • 12月26日总结
    今日主要学习了图中寻找最短路径的算法:迪杰斯特拉算法和弗洛伊德算法迪杰斯特拉算法:include<stdio.h>include<stdlib.h>include<limits.h>include<stdbool.h>//找到未确定最短路径的顶点中距离源点最近的顶点intminDistance(intdist[],boolsptSet[],intnumVerti......