1.初识 Spring

1.1 介绍

Spring 已成为 Java 后端开发的行业标准,无数公司选择 Spring作为基础的开发框架。Spring Boot 和 Spring Cloud,只需引入一些 Starter Dependency,修改一些配置文件,再通过很少量的代码就可以实现上述需求,它们可以帮助工程师更好地基于Spring及各种基础设施来快速搭建系统,可以说,它们的诞生又一次解放了大家的生产力。Spring Boot 和 Spring Cloud已成为Spring 生态中不可或缺的一环。想成为一名合格的 Java 后端工程师,SpringFramework、SpringBoot、Spring Cloud 这三者必须都牢牢掌握。

你能获得什么?

1.通过经验学习,提升实战技巧

课程中会有很多关于“怎么用”的说明,比如:

  • 怎么用 JPA 快速实现一个带特定分页查询的 CRUD Repository?
  • 怎么用 Spring MVC 实现 RESTful
    WebService?
  • 怎么用 Spring Boot 搭建一个具有较强可运维性的应用?
  • 怎么通过 Sleuth实现服务追踪等等?

不仅会用,还得用的爽,那些能提升开发效率的框架、工具都在我们的课程涉猎范围之内。在讲明白“怎么用”的同时,我也希望能帮助大家解决遇到问题时的“怎么办”,比如:

  • 明明做了 AOP 拦截,我的 Bean 却没有被增强,怎么办?
  • Web 层部署在集群中,需要解决分布式 Session 的问题,怎么办?
  • 一直在用 RestTemplate 调用 Web 服务,请求量大了需要优化,怎么办?
  • 默认的 Tomcat 配置不能满足实际需要,需要修改一些配置,怎么办?

在掌握了“怎么用”,了解了“怎么办”之后,在实际工作中就可以做到从容应对。

2.通过原理剖析,加深理解认识

  • 为什么 Spring Boot 能做到引入一个依赖就完成一堆配置?
  • 为什么 Spring Boot 最终生成的 Jar 包可以直接运行?
  • 为什么一行代码都没改就能在 Eureka、ZooKeeper、Consul 之间灵活切换注册中心?

一旦了解了它的原理,自然在遇到问题时就能有新的思路,“怎么做”的灵光乍现也得在日常有所积累。

  • 希望对运行时的 Web 层和 DAO 层有更多的把控,要怎么做?
  • 系统有些关键业务指标要输出给监控系统,又不想自己从头搞一套接口,要做怎么做?
  • Spring Boot用的久了,公司有个内部设施也希望能像它一样有个 Starter Dependency,要怎么做? 手头负责的系统还是 Spring 3.x的,又要引入新的东西,希望能实现 Spring Boot 那样的自动配置,要怎么做?

不仅能知其然,还要能知其所以然,融会贯通后再运用到工作中去,让 Spring 真正为你所用。

PDF 课件和源代码下载地址:

https://gitee.com/geektime-geekbang/geektime-spring-family

框架版本:

前半段课程Spring Boot 2.1.4(Spring对应是5.1.6),后面正好出2.1.5(Spring对应是5.1.7)了,就顺手升级了。Spring Cloud用的是Greenwich SR1。

1.2 Spring 家族

Spring诞生于2002年,成型于2003年,作者Dod Johnson。EJB。
目前已经Spring 5.x版本,支持JDK8-11,Java EE 8

Spring代表了一个家族,包含了Spring Boot(创建任何),Spring Cloud(协调所有),Spring Cloud Data Flow(连接所有)等子项目。

Spring

分层设计,在每一个层都有一个自己的选择,比如数据访问层,可以用JDBC,也就可以用ORM(Hibernate,MyBatis)。
向后兼容性,好的API设计。
代码质量,JavaDoc。
在这里插入图片描述

Spring Boot

快速开发,开箱即用:可以在start.spring.io下载骨架程序直接运行,包含应用容器等东西,如果引入数据库连接驱动(H2,MySQL),引入JDBC支持,会自动配置相关的Bean。
非功能性:安全性,监控

Spring Cloud

简化了分布式系统的开发:配置管理,服务注册与发现,熔断,服务追踪。。。。

1.3 技术趋势

Spring 5.0

从Java 8起步:关心语言新特性,如Java 8 的Lambda
支持Kotlin:
支持WebFlux:异步编程

Spring Boot和Spring Cloud的持续关注

开箱即用
与生态圈有非常紧密的整合
注重运维,实现高可用的应用程序
最佳实现固化到系统实现中

1.4 第一个Spring程序

通过start.spring.io初始化第一个程序。
引入Spring Web,Spring Boot Actuator。

Spring Boot文件结构

在这里插入图片描述
(1)一个由@SpringBootApplication注解的带有main方法的程序,作为整个程序的入口
(2)resources下面生成空的配置文件
(3)测试类

编写并运行hello world程序

package geektime.spring.hello.hellospring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
/**
 * 已引入Spring Web
 * Spring MVC控制器
 * @RestController 相当于 @Controller + @ResponseBody 合在一起的作用
 * @Controller标识在类上,表明该类为控制器类
 */
@RestController
@RequestMapping("/api")
public class HelloSpringApplication {

	public static void main(String[] args) {
		SpringApplication.run(HelloSpringApplication.class, args);
	}

	@GetMapping("hello")
	public String hello(String name) {
		return "Hello," + name;
	}
}

(1)运行程序
(2)从IDE中打开Termianal,访问URL

curl  http://localhost:8080/api/hello?name=hanfei

(3)修改application.properties

# 暴露部分端点
management.endpoints.web.exposure.include = info,health,beans,env
# 暴露所有端点
# management.endpoints.web.exposure.include = *
# 不暴露beans端点
# management.endpoints.web.exposure.exclude = env
# 健康检查,告诉我当前应用程序的状态是否正常
curl http://localhost:8080/actuator/health
{"status":"UP"}

pom文件结构

(1)spring-boot-starter-parent作为整个Maven工程的parent
其中定义了大量的依赖,保证它们是没有冲突的。在使用时不用指定版本号,版本号在parent中的dependencyManagement管理。

(2) spring-boot-maven-plugin
在执行打包的过程中生成一个可执行的jar包(所有的依赖都放进去了)。Spring Boot默认打可执行Jar包,这个Jar的结构和普通的是不一样的,里面包含了所依赖的各种Jar同时也会有Web容器,因此不再需要容器,直接就能运行。也可以选择打普通的War包,然后放在外置的容器里运行

mvn clean package -Dmaven.test.skip=true  // 打包,跳过测试, 执行时默认执行repackage任务
cd target
dir
java -jar hello-spring-0.0.1-SNAPSHOT.jar

如何避免使用spring-boot-starter-parent作为parent

(1)在dependencyManagement中导入spring-boot-dependencies
(2)spring-boot-maven-plugin指定为repackage,告诉Maven在repackage时执行这个plugin

<!-- 引入spring-boot-dependencies -->
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>2.1.1.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

<!-- 插件设为repackage -->
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<version>2.1.1.RELEASE</version>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

(3) 测试类中Junit版本问题
spring boot 2.2之前使用的是 Junit4

import org.junit.Test;

spring boot 2.2之后使用的是 Junit5

import org.junit.jupiter.api.Test;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值