上一篇简单介绍了如何快速创建一个Spring Boot项目,我们有了一个基本的项目结构:
首先,我们分析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>cn.pw</groupId>
<artifactId>pf-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>pf-web</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
从dependencies中的内容,我们很容易找到了上一篇中,我们提到的两个组件web 和 thymeleaf。从pom文件的依赖配置中,我们发现全都一样,具有相同的结构,都有前缀“spring-boot-starter”。作为SpringBoot 四大神器之一的 starter,主要用于简化依赖,我们再也不用为依赖的版本和maven地址而发愁,springBoot总会为我们匹配它认为最优秀的版本(虽然有时候可能并不是我们想要的),让依赖的版本见鬼去吧,具有选择恐慌症的伙伴们该乐坏了。另外,我们还可以自己定义一个starter, 这部分内容这里暂时不作介绍。
其次,我们将重点放在 WebApplication.java 这个类上:
package cn.pw.pf.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
只有 简简单单的几行代码,一个几乎被我们忘掉 的main方法,没错就是它,main方法。大道至简,回到了我们刚学习开发语言时的第一个代码——main方法,在这里它依旧是项目启动的入口,执行着最原始的使命。
和老革命的寒暄到此结束,我们进入重点,重点关注一下新同志@SpringBootApplication 这个注解:
查看@SpringBootApplication的源码,我们发现它是由@SpringBootConfiguration 、@EnableAutoConfiguration和@ComponentScan由三个注解组合而成。
①@SpringBootConfiguration : 配置类,相当于 xml
②@EnableAutoConfiguration : 启用spring自动装配
③@ComponentScan : 和xml配置自动扫描效果一样,默认扫描当前包和所有子包(所以,启动类一定要放在最外层的包中)。
接下来,我们写一个Controller,来访问我们的Hello World!
就在cn.pw.pf.web下创建一个controller包,在写一个HelloWorldController类。
package cn.pw.pf.web.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Hello World Controller
* @Description:
* @Author:libin
* @Date: Created in 2017/11/9
*/
@RestController
@RequestMapping("/")
public class HelloWorldController {
@GetMapping("/hello")
public String helloWorld(){
return "Hello World !";
}
}
OK,我们HelloWorld!写完了,启动项目。直接在idea中运行WebApplication类的main()方法,注意观察控制台。
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v1.5.8.RELEASE)
2017-11-09 23:35:35.779 INFO 25940 --- [ main] cn.pw.pf.web.WebApplication
...//省略中间部分
2017-11-09 23:36:04.967 INFO 25940 --- [nio-8080-exec-1]
o.s.web.servlet.DispatcherServlet : FrameworkServlet 'dispatcherServlet': initialization completed in 29 ms
(小知识:SpringBoot启动时的banner 是可以 自定义的哦!有兴趣的可以了解一下,换一个自己喜欢的banner)
访问 HelloWorld。在浏览器输入 http://localhost:8080/hello 页面上显示出了我们想要的内容:Hello World !
项目打包运行。
我们使用maven 直接打包,在项目pom所在的目录下,执行 mvn package ,打包 成功后,我们在target目录下能找到 pf-web-0.0.1-SNAPSHOT.jar ,执行 java -jar pf-web-0.0.1-SNAPSHOT.jar。
是不是很简单,不过小朋友就要问了,这是个web项目 ,web容器tomcat呢?
tomcat的问题好解释,springBoot自己集成了tomcat的组件。
SpringBoot项目到底是如何启动的呢?启动流程是什么呢?我们的老朋友main()方法到底做了什么?
解压pf-web-0.0.1-SNAPSHOT.jar,打开META-INF 文件夹,用记事本打开 MANIFEST.MF :
Manifest-Version: 1.0
Implementation-Title: pf-web
Implementation-Version: 0.0.1-SNAPSHOT
Archiver-Version: Plexus Archiver
Built-By: libin
Implementation-Vendor-Id: cn.pw
Spring-Boot-Version: 1.5.8.RELEASE
Implementation-Vendor: Pivotal Software, Inc.
Main-Class: org.springframework.boot.loader.JarLauncher
Start-Class: cn.pw.pf.web.WebApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_121
Implementation-URL: http://projects.spring.io/spring-boot/pf-web/
我们看到 Main-Class: org.springframework.boot.loader.JarLauncher和
Start-Class: cn.pw.pf.web.WebApplication
看来JarLauncher类才是springBoot启动的入口,然后才运行的Start-Class。更加详细的启动原理和过程,我们在后面的高级篇里探讨。
下一章我们讨论SpringBoot 配置文件 application.yml (application.properties)