这里是一个学习过程笔记的汇总: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学习文章完成,该回家吃饭了。希望能帮助到同样正在学习的小伙伴。