学习Springboot自动装配原理(初探)
自动配置:
pom.xml
pom.xml文件标签阅读:
- 启动器(依赖):Spring boot的应用启动场景,导入了环境所需的所有依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-parent:
配置了资源过滤、插件
spring-boot-dependencies:
核心依赖在父工程中 进行了版本管理,可以不用指定版本
<groupId>: 项目或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.mycompany.app生成的相对路径为:/com/mycompany/app
<artifactId>:项目的通用名称
<version>:项目的版本
//g a v一般配套出现表明项目(或依赖配置文件)的坐标
<packaging>:打包的机制,如pom, jar
<name>:项目的名称, Maven 产生的文档用
<url>:哪个网站可以找到这个项目,提示如果 Maven 资源列表没有,可以直接上该网站寻找, Maven 产生的文档用
<description>:项目的描述, Maven 产生的文档用
<developers>:开发者信息
<contributors>:类似 developers
<mailingLists>:本项目相关 mail list, 用于订阅等信息
<issueManagement>:项目的问题管理系统(Bugzilla, Jira, Scarab
<organization>:organization information
<licenses>:License
<scm>:允许你配置你的代码库,为Maven web站点和其它插件使用
<distributionManagement>:用于配置分发管理,配置相应的产品发布信息,主要用于发布,在执行mvn deploy后表示要发布的位置
<properties>:①可以在标签内部配置连接数据库的信息。
②也可以通过属性引用外部配置文件信息。
//pom.xml中一般为配置文件的版本信息?(存疑)
<dependencyManagement>:依赖管理
<dependencies>:启动器
<build>:全局配置或针对不同的profile配置
<defaultGoal>:执行build任务时,如果没有指定目标,将使用的默认值。
<directory>:build目标文件的存放目录,默认在${basedir}/target目录
<finalName>:build目标文件的名称,默认情况为${artifactId}-${version}
<filter>:定义*.properties文件,包含一个properties列表,该列表会应用到支持filter的resources中。也就是说,定义在filter的文件中的name=value键值对,会在build时代替${name}值应用到resources中。maven的默认filter文件夹为${basedir}/src/main/filters
<resources>:用于包含或者排除某些资源文件
<resource>包含或者排除某些资源文件
<targetPath>指定build后的resource存放的文件夹,默认是basedir。通常被打包在jar中的resources的目标路径是META-INF
<filtering>true/false,表示为这个resource,filter是否激活
<directory>定义resource文件所在的文件夹,默认为${basedir}/src/main/resources
<includes>指定哪些文件将被匹配,以*作为通配符
<include>
<excludes>指定哪些文件将被忽略
<exclude>
<testResources>定义和resource类似,只不过在test时使用
<plugins>用于指定使用的插件
<plugin>
<groupId>
<artifactId>
<version> 指定插件的标准坐标
<extensions>是否加载plugin的extensions,默认为false
<inherited>true/false,这个plugin是否应用到该pom的孩子pom,默认为true
<configuration>配置该plugin期望得到的properties
<dependencies>作为plugin的依赖
<executions>plugin可以有多个目标,每一个目标都可以有一个分开的配置,可以将一个plugin绑定到不同的阶段,假如绑定antrun:run目标到verify阶段
参考来源:
《pom.xml中各个标签的意思》
《properties标签的使用及细节》
《pom.xml中build标签》
主程序
@SpringBootApplication //程序的主入口
//@SpringBootApplication :标志Springboot应用 启动类下所有资源导入
public class Testone716Application {
// 将springboot应用启动
public static void main(String[] args) {
SpringApplication.run(Testone716Application.class, args);
}
}
- 注解
@SpringBootConfiguration : /*Springboot的配置*/ @Configuration : /*Spring配置类 */ @Component : /*说明这也是一个Spring类组件*/ @EnableAutoConfiguration /*自动配置*/ @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited //以上四个为元注解 @AutoConfigurationPackage /*自动配置包*/ @Import({Registrar.class}) /*自动配置`包注册`*/ //metadata 元数据 @Import({AutoConfigurationImportSelector.class}) /*自动导入选择*/ List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);//获取候选的配置
- 获取候选的配置
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }
META-INF/spring.factories:自动配置的核心文件
[流程图](https://www.processon.com/mindmap/60f4447e1e085376da5baa50)
结论:Springboot所有的自动配置都在启动类中被扫描并加载 : spring.factories所有的自动配置类都在这里,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器,自动装配就会生效,配置成功。
1.springboot在启动的时候,从类路径下/META-INF/spring.factories
获取指定的值;
2.将这些自动配置的类导入容器,自动配置就会生效,帮我们自动配置
3.整个javaEE解决方案和自动配置的文件都在spring-boot-autoconfigure中
4.将所有需要导入的组件,以类名的方式返回,组件就会被添加到容器。
5.容器中也存在很多xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动配置,@Configuration,JavaConfig
6.有了以上,免去手写配置
以上所有均学自kuangstudy.com