目录
1.Spring Boot简介
1.1 Spring历史
在Spring框架还没开发出来时,Java EE以Sun公司所制定的EJB作为标准。在EJB时代,开发一个应用程序需要大量的接口和配置文件,导致开发效率极其的低下。然后在2004年的时候,Spring项目推出了1.0版本,很快人们就抛弃了繁重的EJB标准,迅速地投入到了Spring框架中,于是Spring成为了现实中Java EE开发的标准。
Spring以强大的控制反转(IOC)来管理各类Java资源,迅速降低了各种资源的耦合;Spring的面向切面编程(AOP)通过动态代理技术,允许我们按照约定进行配置编程,进而增强了Bean的功能,它擦除了大量重复代码;Spring还提供了许多整合了当时流行的框架的模板,如持久层框架Hibernate的HibernateTemplate、iBatis的SQLMapClientTemplate等,使其展示了强有力的生命力,并延续至今。
1.2 注解还是XML
早期的Spring,由于当时的JDK并不支持注解,因此只能使用XML。JDK1.5以后加入了注解的新特性,这样注解就被广泛地使用起来。Spring发展到3.0版本以后,引入了大量的注解,于是Spring中产生了这样一个很大的分歧,使用注解还是XML?对于XML的引入,有人觉得繁琐,而对于注解的使用,会使得注解分布到处都是,难以控制,有时候还需要了解很多框架的内部实现才能准确使用注解开发所需要的功能。这个时候,大家形成了这样的一个不成文的共识,对于业务类使用的注解,如控制器@controller,业务层@Service,持久层@Repository;对于一些公用的Bean,如数据库、第三方资源等则使用XML进行配置,直到现在,这样的配置方式还在企业中广泛地使用着。
到了Spring4.0版本以后,注解的功能越来越强大,XML的依赖越来越少,甚至可以完全脱离XML,因此Spring中使用注解开发占据了主流的地位。与此同时,Privotal团队在原有Spring的基础上通过注解的方式继续简化了Spring框架的开发,它们基于Spring框架开发了Spring Boot,所以Spring Boot并非是代替Spring框架,而是让Spring框架更加容易得到快速的应用。在2018年3月,Spring Boot推出了2.0.0 GA版本,该版本基于Spring 5,并引入其最新的功能,能够有效支持Java 9开发。
特别是近年来微服务的流行,越来越多的企业需要快速的开发,而Spring Boot正好符合了现今微服务快速开发、测试和部署的需要,因此越来越多的企业选择Spring Boot作为开发选型。
约定优于配置,这是Spring Boot的主导思想。对于Spring Boot而言,大部分情况下存在默认配置,你甚至可以在没有任何定义的情况下使用Spring框架,如果需要自定义也只需要在配置文件配置一些属性便可以,十分便捷。例如spring-boot-starter-web捆绑了Spring MVC所依赖的包,spring-boot-starter-tomcat绑定了内嵌的Tomcat,这样使得开发者能够尽可能快地搭建开发环境,快速进行开发和部署,这就是Spring Boot的特殊。
1.3 优点
总之,Spring Boot有以下几个优点:
- 简化Spring应用开发的一个框架
- 整个Sring技术栈的一个大整合
- J2EE开发的一站式解决方案
2.微服务
2014年Martin fowler提出,论文地址:https://www.cnblogs.com/liuning8023/p/4493156.html
微服务:架构风格(服务微化)
一个应用应该是一组小型服务;可以通过HTTP的方式进行互通。
每一个功能元素最终都是一个可独立替换和独立升级的软件单元。
3.Spring Boot Hello World
实现的功能:浏览器发送Hello请求,服务器接收请求并处理,响应Hello World字符串
3.1 项目创建
项目创建我们使用IDEA,JDK使用1.8。
打开IDEA编辑器,File->New->Project,创建Spring Boot项目选择Spring Initializer:
填写项目的信息:
选择需要用到的Spring Boo版本,并选择所要依赖的模块。这里我们选择的Spring Boot版本是2.1.1,依赖的模块是Web模块。
等待项目创建完成,项目的目录结构如下所示:
默认生成的Spring Boot项目:
- src/main/java:SpringHelloApplication是程序的主入口,用来启动Spring Boot应用。
- resources文件夹中目录结构:static用来保存所有的静态文件(js css和images等);templates保存所有的模板页面,如freemarker、thymeleaf等(由于Spring Boot使用了嵌入式的Tomcat,默认不支持JSP页面)
- application.properties:Spring Boot应用的配置文件;可以修改一些默认设置。
至此一个完整的Spring Boot应用程序已经创建完成了。
3.2 POM依赖
spring-hello项目的pom文件如下所示:
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.martin</groupId>
<artifactId>spring-hello</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-hello</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<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>
父依赖:pom文件依赖如下的父项目
<!--父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
该父项目又用时依赖下面的父项目:
<!--它来真正管理Spring Boot应用里面的所有版本依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
该父项目是Spring Boot的版本仲裁中心,用来管理项目的所有的版本依赖,以后我们导入默认依赖是不需要写版本,当然如果没有在dependencies里面管理的依赖自然需要声明版本号。
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web:帮我们导入了Web模块正常运行所依赖的组件。
spring-boot-starter开头表示的是Spring Boot的场景启动器。
Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目中引入这些starter相关场景的所有依赖都会导入进来。要用什么功能,就导入什么功能的starter。
build插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
该插件将这个应用打包成jar包,直接使用java -jar的命令进行执行;
主程序类
@SpringBootApplication
public class SpringHelloApplication {
public static void main(String[] args) {
SpringApplication.run(SpringHelloApplication.class, args);
}
}
@SpringBootApplication:Spring Boot应用标注在某个类上说明这个类是Spring Boot的主配置类,Spring Boot就应该运行这个类的main方法来启动SpringBoot应用。
SpringBootApplication注解的实现代码如下:
@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 {
……
}
- @SpringBootConfiguration:Spring Boot的配置类,标注在某个类上表示这个一个Spring Boot的配置类。
- @EnableAutoConfiguration:开启自动配置功能;它告诉Spring Boot开启自动配置功能。其实现的代码如下:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
……
}
@AutoConfigurationPackage注解负责自动配置包:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
@Import(AutoConfigurationPackages.Registrar.class):import是Spring的底层注解,给容器中导入一个组件,导入的组件由AutoConfigurationPackages.Registrar.class来实现。负责将主配置类(@SpringBootApplication标注的类)的所有包及下面所有子包里面的所有组件扫描到Spring 容器。
@Import(AutoConfigurationImportSelector.class):将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。Spring Boot在启动的时候会从类路径META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效了,帮助我们进行自动配置工作,主要是导入一些自动配置类(xxxAutoConfiguration)。而在之前的Spring 应用中,我们需要手动的进行配置。自动配置的实现的jar包为:
spring-boot-autoconfigure
3.4 定义Controller
定义HelloController,并实现hello()方法:
package com.martin.hello;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 定义Hello控制器
*
* @author: xuzongxin
* @date: 2019/1/5 11:54
* @description:
*/
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "{\"message\":\"Hello World\"}";
}
}
@RestController = @Controller + @ResponseBody
@ResponseBody:将返回的值直接写给浏览器,如果是对象就转换成Json。
启动SpringHelloApplication,并在浏览器访问http://localhost:8080/hello