1 Spring Boot简介
(1)Spring应用开发的一个框架,整个Spring技术栈的大整合,J2EE开发的一站式解决方案;
2 首先了解一下单体应用
(1)单体应用:ALL IN ONE ,将所有的内容都放在一个应用中,这是我们之前的web传统的模式;
2.1 优点
开发测试简单,部署简单,运维简单,水平扩展简单,将同一个应用发布在N个系统上,并且实现负载均衡
2.2 缺点
一个很严重的问题,牵一发而动全身,修改就需要重新发布,部署,无法满足现在业务的需求。
3 微服务
3.1 介绍
(1)在2014年,martin fowler提出微服务的**架构风格**
(2)微服务:一个应用应该是一组小型服务,可以通过HTTP的方式进行互通;
(3)每一个功能元素最终都是一个可独立替换和独立升级的软件单元;
(4)通过Spring Cloud来实现项目于项目的通讯,互调,数据的操作,等。
3.2优点
(1)服务独立部署,耦合性低;
(2)服务快速启动,依赖减少,代码量少;
(3)更加适合敏捷开发,可独立替换和独立升级的软件单元,不需要整体重新发布;
(4)职责专一,由专门部分负责专门的服务模块,有利于团体之间分工开发;
(5)服务动态扩展,当某一个服务访问量过大时候,则可以单独扩容即可;
(6)代码复用性 ,每个服务提供rest API,所以基础类都必须抽取出来,很多底层实现都可以以通过接口方式提供 。
3.3缺点及避免办法
(1)分布式部署,调用复杂性高
单体应用,所以模块的调用都是在本地的;
微服务,每个模块都是独立部署,通过HTTP来进行通信,可能会产生很多问题,如网络,容错,调用关系等。
(2)独立数据库,分布式事务的挑战
每个服务都有自己的数据库,去中心化的数据管理,这种模式优点在于不同的服务器,可以选择自身合适的数据库;
如 :订单服务使用MySQL ,评论服务可以使用Mongodb ,商品搜索服务可以用Elasticsearch;
缺点就是分布式事务管理,解决方案就是柔性事务中的最终一致性。
(3)测试的难度提升
服务和服务通过接口来交互,接口有改变时候,调用方法都由影响,这时候自动化测试就非常重要。
(4)运维难度的提升
单体应用,只需要关注一个Tomcat集群,一个MySQL的集群即可;
分布式,当业务增加时,服务器越来越多,服务的部署,监控变的非常复杂,提高运维难度。
4 Spring Boot 环境的配置
4.1 已掌握技能
(1)Spring框架的使用经验
(2)熟练Maven进行项目构建和依赖管理
(3)熟练使用STS或者IDEA
4.2 环境约束
(1)JDK 1.8 SpringBoot推荐1.7及以上 通过cmd中 java -version
(2)Maven3.x SpringBoot推荐3.3及以上较为稳定 通过maven安装根目录下 mvn -v
(3)SpringBoot 1.5.9.RELEASE
4.3 Maven配置
(1)配置Maven根目录中conf文件中settings.xml配置文件中本地库,可配可不配,约配置在55行附近
<localRepository>${user.home}/.m5/repository</localRepository>
(2)配置Maven中远程仓库,根据自己需求,阿里云静态服务器仓库,约配置在155行附近
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
(3)配置Maven中JDK版本,建议必须配置为1.7以上版本,JDK版本约配置在220行附近
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>
1.8
</maven.compiler.compilerVersion>
</properties>
</profile>
4.4 IDEA配置Maven
(1)通过IDEA中打开File中Setting设置,搜索框Maven,修改如图配置
5 Spring Boot入门案例 Hello World
需求说明:浏览器发送hello请求,服务器接收请求并处理,相应HelloWorld字符串
5.1 创建Maven工程(jar)
(1)打开File中New中Project,如下操作即可
(2)。。。。
(3)项目名称与项目的路径可更换到自己的目录下
(4)弹出内容为Maven项目需要导入依赖,点击自动导入,则pom.xml文件中配置依赖则自动导入。
5.2 导入Spring Boot依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
5.3 编写一个主启动类
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @SpringBootApplication此注解修饰为SpringBoot主启动类
*/
@SpringBootApplication
public class HelloWorldMainApplication {
//快捷键 psvm生成main方法
public static void main(String[] args) {
//Spring应用启动
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
5.4 编辑controller
package com.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @Controller 交给Spring容器进行管理该对象
* @ResponseBody 将返回数据直接返回页面,不通过视图解析器
* @RequestMapping("/hello") 代表通过hello请求进行访问此方法
* http://localhost:8080/hello localhost:8080是tomcat服务器默认端口
*/
@Controller
@ResponseBody
public class HelloWorld {
@RequestMapping("/hello")
public String hello(){
return "HelloWorld!!!!";
}
}
5.5 导入打包插件
<!--此插件为打包插件,必须添加,即可打包为jar报-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
5.6 打包jar包
5.7 将jar包复制到目录中
(1)jar包的目录下,通过 java -jar spring-boot-01-helloworld-1.0-SNAPSHOT.jar 执行即可
注意:不要将jar包放到C盘,如果没有其他盘符,不要放在敏感盘符中,可能会导致权限的问题。
(2)执行成功
(3)访问 http://localhost:8080/hello
6 分析Spring Boot项目pom文件
6.1分析pom.xml文件
(1) Spring Boot依赖于dependencies项目
<!--Spring Boot依赖于spring-boot-dependencies项目中properties标签中配置很多相关框架的依赖版本-->
<!--Spring Boot的版本仲裁中心,以后在导入框架依赖无需导入版本(如果没有则需要声名版本)-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
(2) Dependencies项目中的Properties标签中配置了相关依赖的版本;
则说明导入依赖时只需要声明依赖不需要配置版本(标签中未配置的依赖也是需要指定版本)。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
(3) 相关依赖,简单列举一部分
6.2 启动器
(1)spring-boot-starter-web :SpringBoot场景启动器,帮我们导入了web模块正常运行的依赖组件,如json,tomcat,web,webmvc等
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
(2)通过SpringBoot将所有的场景功能都抽取出来,成为一个个starters(启动器),只需要在项目中引入相关的starters场景,则依赖都会导入进来,实现需要什么场景直接导入什么场景启动器。
如 : aop,redis,web,jpa数据库,monogdb非关系数据库,等等
7 Spring Boot主程序类解析
7.1 分析主程序
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @SpringBootApplication此注解修饰为SpringBoot主启动类
*/
@SpringBootApplication
public class HelloWorldMainApplication {
//快捷键 psvm生成main方法
public static void main(String[] args) {
//Spring应用启动
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
@SpringBootApplication注解,主程序入口注解,此注解标注在某一个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法启动SpringBoot应用
7.2 分析@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 {
(1)@SpringBootConfiguration :SpringBoot的配置类,标注在某个类上,表示这是一个SpringBoot配置类;
@Configuration:Spring配置类上标注此类,配置类==配置文件,配置类也是容器中的组件。
(2)@EnableAutoConfiguration:开启SpringBoot的自动配置功能,不需要我们手动配置;
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class) 由@Import注解中类将Spring中组件导入到容器中
通过短点查看Registrar类中registerBeanDefinitions方法,返回@SpringBootApplication注解修饰的包名称
由此可见此注解修饰后的包,即子包里面的组件都会扫描到Spring容器中。
@Import(AutoConfigurationImportSelector.class) 给容器中导入组件?
AutoConfigurationImportSelector:此类导入哪些组件选择器?
导入组件以全类名的方式String数组返回,这些组件将会被添加到容器中;
通过Debugger模式,给容器中导入的组件非常多的自动配置类(xxxAutoConfigration),将容器中导入场景需要的
所有组件,并配置好这些组件
有了自动配置类,免去了我们手动编写配置注入等功能的工作;
通过调用SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,ClassLoader);
SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取 EnableAutoConfiguration指定的值,
将这些值作为制动配置类导入到容器中,自动配置类就生效,实现自动配置
J2EE的整合解决方案和自动配置都在spring-boot-autoconfigure-2.3.2.RELEASE.jar