一.前言
一年多了,感觉除了工作上遇到的,似乎没有接触工作外的技术。不进则退,虽然工作相对安逸,可以还是有所担忧。趁着年轻,多学学东西。先定个小目标,学习完Springboot。关于SpringBoot的笔记这是第一篇。
二.SpringBoot 的作用
对于接触过SSH、SSM框架的人来说。一个项目开发的流程大致如下:新建一个项目——导入相应的jar包——配置各种配置文件——写逻辑代码——测试打包——配置运行环境——跑项目。
SpringBoot 的作用就是将以上多余的步骤比如:导入jar包,写配置文件,配置运行环境 进行省略,让SpringBoot给你做,你乖乖写你的逻辑代码就好了(好吧,怎么感觉越来越程序员被工具人化,越来越容易被替代 了。。。。。)
三.一个简单HelloWorld程序所需的文件以及代码
该代码的作用是启动一个简单的web项目,访问结果为页面显示Hello World。
1.Pom.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.fd</groupId>
<artifactId>springboot-01-helloworld</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. 主程序代码
package com.springboot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
3.逻辑代码
package com.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
四.解析配置文件和代码的作用
首先思考:完成这个一个访问,如果用以往的架构知识,那么至少涉及到SpringMVC 和Spring 这两个架构。那么上面这几个文件,如何实现了Spring和SpringMVC的功能呢?
1.Pom.xml文件
1.1.首先看父类spring-boot-starter-parent
这个是spring-boot-starter-parent,可见其也有父类:spring-boot-dependencies 从名字看出,父类应该标明了依赖
在父类spring-boot-dependencies中我们看到了版本控制的注解,所以说明我们新建的Spring-boot项目的版本控制在这里
1.2.接着我们来看看依赖 spring-boot-starter-web 目前对于这个的理解,我只停留在这代表了Web的相关需要配置的东西
点进去看看,原来spring-boot-starter-web里面包含了一个Web项目所需要的依赖
接着回过头看看,spring-boot-starter-web的父类spring-boot-starters。我们可以看到父类中有许多的spring-boot-starter-xxx
,由此我们可以大概知道,一个starter代表一个功能模块,项目需要用到那个功能,就导入哪个功能模块,像我们的项目,用到了Web功能,所以是spring-boot-starter-web模块
所以说,spring-boot-starter-web的作用就是导入项目需要的相关依赖,而版本就是由spring-boot-starter-parent控制
总结:
a.关于Pom文件,父启动器管理所有依赖的版本号;子启动器管理了依赖的类型.
b.SpringBoot 是将所有功能场景都抽取出来并封装为一个个的启动器。然后开发人员根据需要,选择启动器。SpringBoot便会为项目配置相关开发环境。
2.接下来我们来解析一下主程序的代码
main中的代码作用是启动类或者项目的意思,那么为什么逻辑代码类也会生效尼?这个我们需要来看一下@SpringBootApplication这个注解在这里的发挥了什么作用
可以看出@SpringBootApplication 其实是一个复合注解,主要由@SpringBootConfiguration和@EnableAutoConfiguration
从字面来理解,@SpringBootConfiguration应该表示被这个标注的都属于SpringBoot的构造,其实可以继续看下去,@SpringBootConfiguration的最底层就是@Component(被@Component标注的类,代表这个类将被spring容器中进行管理)
接着对@EnableAutoConfiguration进行解析,字面理解为 实现自动化的结构,当然实际的作用如下:
以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效;
可以看出@EnableAutoConfiguration是由两个注解复合而成, @AutoConfigurationPackage(自动配置包)和@Import({EnableAutoConfigurationImportSelector.class}),而@AutoConfigurationPackage的底层是@Import({Registrar.class})
@Import的作用就是将被其注解的类导入到Spring的容器中,那么Registrar.class呢?
看源码,其实主要是类中的registerBeanDefinitions方法,该方法的作用是将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;这个主要作用是起到范围约束作用
接下来我们来看看 EnableAutoConfigurationImportSelector.class 字面理解应该是自动导入哪些组件的选择器。
我们来看看EnableAutoConfigurationImportSelector 父类的AutoConfigurationImportSelector的
打了断点以后,我们可以发现该方法的作用是
将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件;有了自动配置类,免去了我们手动编写配置注入功能组件等的工作。
所以,@EnableAutoConfiguration的作用就是扫描被@SpringBootApplication所注解的包下所有的组件(@AutoConfigurationPackage)自动扫描导入到Spring容器(@Import({EnableAutoConfigurationImportSelector.class})
) 而@SpringBootConfiguration的作用主要是起@Component作用((被@Component标注的类,代表这个类将被spring容器中进行管理))
总结:通过注解和导入功能包,最终才使我们的项目可以正确运行并被访问。其中POM.xml文件起导入依赖包的功能,@SpringBootApplication起到了注解以及自动扫描的作用(相当原来的配置文件)。