SpringBoot之HelloWorld仔细分析
程序中的pom.xml文件:
一、父级标签
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.0.5.release</version> <relativepath/> </parent>
这是一个父级标签:让我们点击org.springframework.boot就会查看到他的父级的依赖:
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-dependencies</artifactid> <version>2.0.5.release</version> <relativepath>../../spring-boot-dependencies</relativepath> </parent>
就会发现它才是真正的springboot的版本控制中心,这样一来我们在导入
依赖的时候就不需要写导入的版本号了,但是如果不在dependencies里面
管理的依赖还是需要进行版本号的输入的。
二、依赖标签(启动器)
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency>
spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块
正常运行所依赖的组件;
spring boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),
只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么
功能就导入什么场景的启动器。
例如:
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-test</artifactid> <scope>test</scope> </dependency>
这是一个test(测试用的)启动器,我们要用的是测试功能,导入测试场景的启动器就可以了。
程序中的主程序文件:
package com.example.demo; import org.springframework.boot.springapplication; import org.springframework.boot.autoconfigure.springbootapplication; @springbootapplication public class demoapplication { public static void main(string[] args) { springapplication.run(demoapplication.class, args); } }
@springbootapplication:spring boot应用标注在某个类上说明这个类是springboot的主配置类,
springboot就应该运行这个类的main方法来启动springboot应用;
我们接下来就研究一下这个@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 {
1)、@springbootconfiguration:springboot的配置类,标注在哪个类上面就代表这个类就是一个springboot
的配置类,我们点进这个注解(@springbootconfiguration)里面看一下:
@target({elementtype.type}) @retention(retentionpolicy.runtime) @documented @configuration public @interface springbootconfiguration { }
我们看到了这个@configuration注解,这就证明了springbootconfiguration 就是一个配置类,再点进到这个注解
(@configuration)里面看一下:
@target({elementtype.type}) @retention(retentionpolicy.runtime) @documented @component public @interface configuration { @aliasfor( annotation = component.class ) string value() default ""; }
我们看到了@component这个注解,证明了配置类也是容器中的一个组件。
2)、@enableautoconfiguration:开启自动配置,这样一来我们需要的所有配置,springboot都将帮我们
配置完成,我们点进去这个注解(@enableautoconfiguration)看一看:
@target({elementtype.type}) @retention(retentionpolicy.runtime) @documented @inherited @autoconfigurationpackage @import({autoconfigurationimportselector.class}) public @interface enableautoconfiguration { string enabled_override_property = "spring.boot.enableautoconfiguration"; class<?>[] exclude() default {}; string[] excludename() default {}; }
这里面有这两个重要的注解(@autoconfigurationpackage与@import({autoconfigurationimportselector.class}))
先研究一下这个注解(@autoconfigurationpackage)这是自动配置包的意思我们点进去看一下这个注解:
@target({elementtype.type}) @retention(retentionpolicy.runtime) @documented @inherited @import({registrar.class}) public @interface autoconfigurationpackage { }
里面有一个@import({registrar.class})注解,这是spring底层的注解,是导入一个组件的意思,导入的组件由
registrar.class将主配置类(也就是springbootapplication标注的类)的所在层级以及该层级以下所有层级的
所有组件都扫描到spring的容器中。
接下来我们研究一下这个注解(@import({autoconfigurationimportselector.class}))这是一个给容器中导入组件的
一个注解,autoconfigurationimportselector:导入哪些组件的选择器;将所有需要导入的组件以全类名的方式返回;
这些组件就会被添加到容器中;会给容器中导入非常多的自动配置类(xxxautoconfiguration);就是给容器中导入
这个场景需要的所有组件,并配置好这些组件;下面是源码(autoconfigurationimportselector这个类下面的getautoconfigurationimportfilters的方法):
protected list<autoconfigurationimportfilter> getautoconfigurationimportfilters() { return springfactoriesloader.loadfactories(autoconfigurationimportfilter.class, this.beanclassloader); }
我们进入到springfactoriesloader中看一下:这个是加载properties属性文件的方法
public abstract class springfactoriesloader { public static final string factories_resource_location = "meta-inf/spring.factories"; private static final log logger = logfactory.getlog(springfactoriesloader.class); private static final map<classloader, multivaluemap<string, string>> cache = new concurrentreferencehashmap(); public springfactoriesloader() { }
我们看到所加在的properties文件的路径是meta-inf/spring.factories,我们找一下这个文件的位置看一下里面都有什么:
spring boot在启动的时候从类路径下的meta-inf/spring.factories中获取enableautoconfiguration指定的值,将这些值作为
自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;
j2ee的整体整合解决方案和自动配置都在spring-boot-autoconfigure-2.0.5.release.jar;中
上一篇: 数据中心网络成2013年云计算发展羁绊
下一篇: IT架构或面临重组?看云计算深层影响
推荐阅读
-
SpringBoot之HelloWorld仔细分析
-
SpringBoot 之 @Transaction注解的类级别和方法级别的区别
-
SpringBoot开发案例之整合Kafka实现消息队列
-
每天一个SpringBoot注解之@Qualifier
-
每天一个SpringBoot注解之@Configuration
-
Springboot基础之RedisUtils工具类
-
springboot系列之03-使用IDEA完成第一个示例程序
-
SpringBoot 2.0 开发案例之百倍级减肥瘦身之旅
-
SpringBoot系列教程JPA之基础环境搭建的方法
-
Android NDK 环境搭建 之 起始篇NDK HelloWorld