微服务:Spring Boot第二篇——运行原理和HelloWorld

这次来通过一个DEMO程序来学习Spring Boot的运行原理,参考的书为《Spring Cloud与Docker 微服务架构实战》,采用的版本为Java 1.8,Spring Boot 1.5.6(后改为1.5.4),IDE是STS(Spring Tool Suite).

首先以网页的形式来生成自己需要的一个Spring Boot初始目录,这是Spring官方提供的生成工具,各项选择如下。


Group和Artifact的输入会生成com.movie.example_1的目录,右侧是选择依赖项,这里选择了Web,因为这是Web应用;JAP用来做数据持久化;H2为一个内嵌的小型数据库用来存储数据。这里如果不选择的话,后面需要自己在pom.xml中配置。点Generate Project,下载并解压文件,在STS中选择导入Existing Maven Project,就可以开始编写了。

先来学习一下Maven,在上面的图片里,我们在Generate a后面选择了Maven Project,就是选择以Maven作为这个项目的管理工具。Maven的主要作用就是统一开发规范和简化配置,先来看一下导入后的目录。

导入项目过几秒钟之后,会自动形成入上图所示的目录结构,如果之前做过Java类的开发,会发现这和一般的Java工程目录结构不太一样,一般的工程只有一个src,自己需要

来定义哪种文件放在哪里,Mave自动生成了存储源代码和资源的目录,进行单元测试的目录,统一了目录结构。

最下面有一个pom.xml,pom是Project Object Model 的缩写,用于描述整个Maven项目,是Maven的核心文件,其简化配置的功能也是通过该文件实现。下面罗列一下里面各种

标签的作用。

<?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.movie</groupId>
	<artifactId>example_1</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>example_1</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.6.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-data-jpa</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>com.h2database</groupId>
			<artifactId>h2</artifactId>
			<scope>runtime</scope>
		</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>

  1. groupId, artifactId, version这三个东西组成了我们这个项目的坐标,比如XXX公司的一个电影商业项目,可以这样命名,groupId为com.XXX,artifactId为Movie.
  2. packing:项目发布时的打包方式,默认为jar
  3. name和description都是用户自己添加的项目描述
  4. parent,集成的父项目的标识
  5. property中说明了项目编码为UTF-8,java版本为1.8
  6. dependency标签中都标识了我们的项目所依赖的jar包,Maven在本地仓库中有一些包,如果找不到就会去远程下载。
  7. build用于项目配置,plugin中指定了我们使用的插件。
随后在com.movie.example_1下建立两个目录,entity和controller,这两个目录分别存放实体类和控制类,现在首先来写一个hello world,在controller下新建一个类,代码如下。

package com.movie.example_1.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MovieHelloController {
	@RequestMapping("/hello")
	public String Hello(){
		return "Hello there";
	}
}
然后右键在自动生成的Example1Application.java上run as JavaApplication,等控制台输出完毕,在浏览器页面输入http://localhost:8080/hello,应该就可以看到hello there的显示了。

(我在这里遇见一个问题,在Example1Application.java中import spring时报错,在stackflow上找了半天才发现是版本问题,刚开始我还以为是maven的版本冲突。我看了下昨天的代码,

昨天Spring Boot还是1.5.4版本,今天就变成1.5.6了,估计其他的插件还都没更新吧)

下面来详细学习一下Spring Boot的运行过程,先从程序入口开始。

package com.movie.example_1;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Example1Application {

	public static void main(String[] args) {
		SpringApplication.run(Example1Application.class, args);
	}
}
@SpringBootApplication是一系列注解的组合,其中最主要的是@Configuration,@EnableAutoConfiguration,@ComponentScan三个,因为这是所谓的最佳实践,最经常被一起这样使用,所以Spring Boot将其合并为一个SpringBootApplication.按照我的理解,@Configuration标注一个类为配置类,创建了一个Spring IOC容器,而这个注解被建议添加到main方法上,而@EnableAutoConfiguration被建议添加到主@Configuration类上,这个注解可以根据你添加的依赖来自动判断你的应用类型并相应的对Spring设置,@ComponentScan自动收集sub-package下有@component @service @Responsitory @controller注解的所有类,并将它们注册为spring beans,这也是为什么我们建立的controller和entity包和主函数同级。

SpringApplication.run的启动非常复杂,总体来讲有这几步:

  1. 创建SpringApplication对象,在该对象初始化的时候根据项目里面的某个特征类来决定创建什么类型的ApplicationContext,在创建的时候还会查找和加载所有可用的ApplicationContextInitializer,查找加载所有可用的ApplicationListener
  2. 执行run()方法,查找所有SpringApplicationRunListener,调用他们的started()方法
  3. 创建并配置当前Spring Boot应用需要的Environment,然后调用所有SpringApplicationRunListener的environmentPrepared()方法
  4. 将准备好的环境设置给创建好的Applicationcontext使用,调用ApplicationContextInitializer的initialize方法对创建好的ApplicationContext进行进一步处理
  5. 调用所有SpringApplicationRunListener的contextPrepared方法通知他们ApplicationContext已经准备好
  6. 将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IOC容器加载到已经准备完毕的ApplicationContext中
  7. 调用所有SpringApplicationRunListener的contextLoaded()方法
  8. 调用所有ApplicationContext的refresh()方法
  9. 查找ApplicationContext中是否有注册CommandLineRunner(),如果有则遍历执行它们
  10. 调用ApplicationRunListener的finished()方法
了解这些步骤可以在SpringApplication.run执行过程中调用我们自己的方法。

接下来看在com.movie.example_1.controller目录下的MovieHelloController文件,先看第一个注解@RestController,这是@Controller和@ResponseBody的一个结合体。当实现一个RESTful web services的时候,response将一直通过response body发送。为了简化开发,Spring 4.0提供了一个专门版本的controller就是RestController.  RequestMapping是一个用来处理请求地址映射的注解,在这里我们映射了/hello这个页面。

写的也不短了,作为一个HelloWorld程序就先学习这么多,下一节学习数据库和相关配置的原理。



猜你喜欢

转载自blog.csdn.net/roll_jj/article/details/76223659