Spring Boot学习(二):Hello Word案例详解

这里是一个学习过程笔记的汇总:Spring Boot学习汇总


上一篇,进行了Hello Word案例的学习,深深的感受到了springboot给我们开发上带来的便捷,所以就想着研究下这其中的一些原理,如下:

1、pom.xml文件解析

1.1、spring-boot-starter-parent

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

pom文件中的父依赖,spring-boot-starter-parent,那么这个父依赖时干什么的呢?点进去之后会看到有另外一个父项目: spring-boot-dependencies

​
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
	<version>1.5.9.RELEASE</version>
	<relativePath>../../spring-boot-dependencies</relativePath>
</parent>

​

继续点进去看,可以发现如下图

这个父依赖中有个properties标签,其中有很多jar包的版本,那这应该就是springboot项目我们导入依赖后不需要写版本号的原因了吧(当然,没有在dependencies里面管理的依赖自然需要声明版本号)。所以,真正管理springboot应用中的所有依赖版本的是 spring-boot-dependencies,名副其实的版本仲裁中心。

1.2、启动器

spring-boot-starter-web,是Hello Word案例中的另外一个jar包,我们将这个jar分为两部分解释:spring-boot-starter     web

spring-boot-starter:这个是什么呢?我们可以称其为spring-boot场景启动器,springboot中会有一系列的spring-boot-starter开头的jar包,适用于不同的场景。

例如此处用到的  spring-boot-starter-web,这个就是一个web模块依赖,帮我们导入了所有web模块正常运行所需要的组件。点进去可以看到如下:

可以看到包含了spring-web,spring-webmvc等web开发所需要的jar包,还有tomcat依赖。

类似的spring-boot场景启动器还有很多,具体可以参考官方文档:spring-boot-starter详解

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),我们需要用到哪个场景时只导入相关的starter,即可将所需要的所有依赖全部导入。

2、程序启动类

/**
 *  @SpringBootApplication 来标注一个主程序类,标明这是一个Spring Boot应用
 */
@SpringBootApplication
public class HelloWordMainApplication {
    public static void main(String[] args) {
        // 启动springboot应用
        SpringApplication.run(HelloWordMainApplication.class, args);
    }
}

可以看到这个启动类就一个注解,@SpringBootApplication,翻译过来就是Spring Boot应用,标注在某个类上就代表这个类是Spring Boot的主配置类,Spring Boot项目就应该运行这个类的main方法进行启动。

点进这个注解,如下:

@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 {

}

可以看到有很多的注解:

@ComponentScan:在程序启动时,自动扫描启动类所在包及其子包下被@Component@Controller@Service@Repository等注解标注的类,并将其添加到spring容器进行管理。

@SpringBootConfiguration: Spring Boot的配置类,标注在某个类上,表示这个类是Spring Boot的配置类,这个注解点进去你会看到另外一个注解,@Configuration,这个是spring的注解,一般用作配置类上。

@EnableAutoConfiguration:字面理解,即开启自动配置,当然实际作用也是如此,加上这个注解之后,就是告诉Spring Boot开启自动配置功能,以前我们需要配置的东西(bean的管理),Spring Boot帮我们自动配置。点进去看一下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

}

             @AutoConfigurationPackage注解:自动配置包,点进去可以看到一个注解:           @Import(AutoConfigurationPackages.Registrar.class) ,这个注解是Spring的底层注解,作用是给容器中导入一个组件;导入的    组件由AutoConfigurationPackages.Registrar.class类来定义。可以点进去这个Registrar类,然后打断点,可以看到,项目启动时,所有的 在主配置类(@SpringBootApplication标注的类)的所在包及其子包里面所有的类都会扫描到Spring容器中。(这里就可以看出上一篇中提到的spring boot默认包扫描)

         @Import(EnableAutoConfigurationImportSelector.class),给容器导入组件。

                            EnableAutoConfigurationImportSelector,这个类,是一个选择器(同样可以断点访问进去看一下),选择给容器导入哪些组件,将需要的组件以全类名的方式返回。这些组件就会被添加到容器中,会给容器导入非常多的自动配置类(xxxAutoConfiguration),就是给容器导入这个场景所需要的组件。如下图(debug时):

有了这些配置类,就省去了很多手动编写配置类并手动导入的工作。

上图可以看到,所有的配置类,都在spring-boot-autoconfigurations-1.5.9.RELEASE.jar包下,如下是所有的自动配置类:

在学习的过程中,可以debug一下源码,会有不一样的收获。

到此,第二篇spring boot学习文章完成,该回家吃饭了。希望能帮助到同样正在学习的小伙伴。

发布了34 篇原创文章 · 获赞 43 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/pavel101/article/details/83791361