SpringBoot-HelloWorld的pom文件配置

前言

关于如何搭建Springboot hellowolrd应用其实很简单,网上也有非常多的教程,我之前也写过一个最简单的springboot hello world应用,可以看看Springboot hello world搭建

其实在搭建springboot应用中,可能会明显感觉到其中省去了很多之前惯用的Spring+SpringMVC+Mybatis中的一些配置,在之前,我们需要在SpringMVC中开启扫描和注解,Spring配置文件中同样要配置扫描以及数据源等诸多配置,当这些工作准备好了之后才能开始正儿八经地写业务代码。Springboot虽然省去了诸多的配置步骤,但大家需要清楚的是这些配置和整合实际上并没有减少,而是在SpringBoot较少的配置中包含进去了,本文我想针对Hello Wolrd的应用进行展开说明。

配置说明

1、jar包的解压内容分析

首先我想说的是,在hello world的应用中我有提到可以将该工程打成jar包,执行java -jar xxx包的形式将应用启动起来,但实际上有心的同学肯定愿意做这样的尝试,使用解压工具将打出的jar包进行解压,观察一下它里面的目录内容,我们可以进入到/BOOT-INF/lib的目录下,我们发现这里面包含了很多jar包:

我们发现其中有内嵌的tomcat、springmvc、日志log4j等等jar包,这就是为什么,我们直接运行java -jar xxx后,在浏览器同样能出现hello world的输出。但实际上这些配置,我们在构建hello world的时候并没有手动去做。这是为什么呢?让我们回到pom.xml这个配置文件。

2、pom文件配置分析

打开pom.xml文件,其中有这么这几个配置:

1、父项目parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

官方文档或一些技术文章可能会有说明,如果你不想使用该父项目时,可以自己进行选择,既然叫父项目,那么就说明这个配置应该是继承或者沿用的某个配置依赖,我们可以ctrl+鼠标左键点击spring-boot-starter-parent,进入了spring-boot-starter-parent-...pom.xml,发现它的父项目还有一层parent,

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

它的父项目为spring-boot-dependencies,我们再次追进去,进入到了spring-boot-dependencies-xxx.pom文件,在该文件我们会发现该文件中的<properties>标签中包含很多依赖以及该依赖的版本信息。至此追到底了,这时我们就要明白,我们手动配置这几行的parent配置,实际上底层Springboot为我们自动配置很多的依赖,所以说spring-boot-dependencies才是真正管理springboot应用里面的所有依赖版本。dependencies里面的这些配置都为我们省去了。

注意:虽然这种配置使得我们导入的依赖默认不需要写版本号,如果你需要使用到dependencies中管理之外的依赖,你还是需要额外地声明该依赖的版本号

2、spring-boot-starter-web配置

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

我们发现还有一个名为spring-boot-starter-web配置,同样追加springboot-starter-web,它的dependdencies下也包含了诸多依赖配置,诸如spring-boot-starter/tomcat/springmvc等依赖,这些发现这些依赖都和和视图场景相关,实际上org.springframework.boot是springboot的场景启动器,它帮我们导入了web模块正常启动依赖的组件。我们可以查看官方文档,搜索starters 发现它包含了诸多独立功能的组件配置,并且贴心地提供了每个功能在pom中配置,也就是说,springboot 将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里引入这些starter相关场景的所有依赖都会导入进来,要用什么场景就导入什么场景的启动器。

3、Hello world主程序分析

主程序类:Application类,其中有一个@SpringbootApplication注解,springboot应用标注在某个类上说明这个类是springboot的主程序类,springBoot就应该运行这个类main方法来启动springboot应用,实际上当我们追加到这个注解中发现,这个注解是诸多注解的一个组合形态:

 

@springbootConfigration:Springboot的配置注解

@springbootConfigration注解标注在一个类上,表示这是一个Springboot的配置类,我们使用ctrl+鼠标左键追加进去,发现它的原始注解是@Configuration注解,这个注解对于之前玩Spring+SpringMVC的同学来说应该非常熟悉吧,之前spring配置中,我们一般用@Configration注解来替代配置文件,配置类也是容器中的一个组件@component。

2.@EnableAutoCongfigration

字面意思,开启自动配置功能,以前我们需要配置的东西,Springboot帮我们自动配置,@EnableAutoConfiguration-->@AutoConfigrationPackage--->@Import({Register.class}),这样明了了,实际上它的底层还是spring的底层注解@Import,给容器中导入一个组件(组件名由AutoConfigurationImportSelector来指定),导入的组件由AutoConfigrationPackages.Registra.class指定。Register的类指定需要导入的package包,再次追加到Register类中,发现有这么一个方法:

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));

正是在做导入包的工作,metadata是所需依赖的元数据。

我们还可以做以下动作来证实以上描述,在这行代码打上断点,debug启动,我们选中new AutoConfigurationPackages.PackageImports(metadata).getPackageNames().toArray(new String[0])右键选择Evaluate Expression计算这个代码的值

 我们result结果中发现值为"com",而com正是我们创建Application主程序类所在的包名,其次,在debug的信息栏中我们可以metadata元数据introspectedClass指向的也正是我们的主程序类Application

 

所以,我们可以说,metadata表示的是注解的元信息,它标注的是SpringBootApplication里面的东西,它是标注在com.Application类上,这就是我们的启动类,通过getPackageNames()方法获取到主配置类Application所在的包下面所有组件依赖都扫描进去。

如果有同学不信的话,可以做以下实验,当你将Controller类移到com包之外,然后启动程序,我们发现启动会有错误信息打印。所以,@AutoConfigurationPackage注解就是讲主配置类所在包下的所有组件全部扫描到spring容器中。

3、spring-boot-maven-plugin配置

这个配置就简单了,如果你想讲应用打成对应的jar包,那么你需要加入该配置。

总结

以上就是我针对自己搭建的hello world应用配置文件的说明,难免有说的不对地方,请大家指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章