SpringBoot——基础开发(上)

本文介绍了SpringBoot的基础知识,包括SpringBoot的简化配置、快速启动和项目启动机制,详细讲解了@SpringBootApplication注解的工作原理。同时,文章还探讨了SpringBoot如何使用模板引擎开发Web项目,介绍了RESTful风格Web项目的开发,包括前后端分离和接口规范。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 SpringBoot 简介

  Spring Boot 为简化 Spring 应用开发而生,Spring Boot 中的 Boot 一词,即为快速启动的意思。Spring Boot 可以在零配置情况下一键启动,简洁而优雅。为了让 Spring 开发者痛快到底,Spring 团队做了以下设计:
  简化依赖,提供整合的依赖项,告别逐一添加依赖项的烦恼;
  简化配置,提供约定俗成的默认配置,告别编写各种配置的繁琐;
  简化部署,内置 servlet 容器,开发时一键即运行。可打包为 jar 文件,部署时一行命令即启动;
  简化监控,提供简单方便的运行监控方式。

2 第一个SpringBoot项目

方式一:访问Spring Initializr 网址:https://start.spring.io/
在这里插入图片描述

方式二:IDEA中内嵌的Spring Initializr
在这里插入图片描述

3 Spring Boot 项目启动机制

3.1 前言

  Spring 本质上是一个容器,里面存放的是 Java 对象,放入容器的 Java 对象被称为 Spring 组件(Bean)。

  而 XML / 注解 / Java 类三种配置方式,只是形式不同,目的都是在容器中注册 Bean 。三种方式可以同时使用,只需注意Bean 命名不要发生冲突。

  当我们使用 Spring Boot 时会有变化吗?实际上,容器还是那个容器,配置也还是那三种配置。当然 Spring Boot 本身就是为了简化配置,所以基本不再使用 XML 配置方式了。

3.2 Spring Boot 是如何启动的

  Spring Boot 项目生成后,只有简简单单一个类,简单优雅。

实例

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

分析代码
  SpringApplication.run:Spring 应用的启动方法,运行该行代码后, Spring 应用就跑起来了。这个方法有两个参数, args 是命令行参数,此处没啥作用;另一个参数是 SpringBootHelloApplication.class,包含类的信息。
  这个类有啥信息啊?放眼看去,除了一个类名、一个静态方法外,并无其他。凭这些信息就能启动 Spring 应用?
  等等,还有一个注解 @SpringBootApplication ,该注解是标注在类上的,属于类的信息。Spring Boot 启动的秘密就在这个注解上。

3.3 神奇的 @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 注解,它继承自 @Configuration 注解,功能也跟 @Configuration 一样。它会将当前类标注为配置类了,我们在启动类中配置 Bean 就可以生效了。
  其次是 @ComponentScan 注解,用来指定我们要扫描的包,以便发现 Bean 。注意在默认情况下, SpringBoot 扫描该注解标注类所在包及其子包。当我们的控制器、服务类等 Bean 放到不同的包中时,就需要通过 @ComponentScan 注解指定这些包,以便发现 Bean 。
  最重要的是 @EnableAutoConfiguration 注解,用来启动自动配置。开启自动配置后, Spring Boot 会扫描项目中所有的配置类,然后根据配置信息启动 Spring 容器。
  拥有了 @SpringBootConfiguration ,就拥有了一个可以拿来即用的 Spring 容器环境了。

4 Spring Boot 使用模板引擎开发 Web 项目

4.1 前言

  当浏览器将请求抛给控制器,控制器处理好数据后,就跳转 JSP 等模板引擎页面。注意在跳转的同时,还会将数据组装好,也交给模板引擎处理。
  模板引擎会根据数据,和模板引擎的规则,动态生成 HTML 页面,最后返回给浏览器显示。

4.2 模板引擎使用场景

使用 Spring Boot 开发 Web 项目,大体上有两种方式。
  第一种方式,是后端服务化的方式,也是当前的主流方式。前端是静态的 HTML 页面,通过 Ajax 请求 Spring Boot 的后端接口。 Spring Boot 返回数据一般采用 JSON 格式,前端接收后将数据显示。
  第二种方式,是采取模板引擎的方式。前端的请求,到达 Spring Boot 的控制器后,控制器处理请求,然后将返回数据交给模板引擎。模板引擎负责根据数据生成 HTML 页面,最后将 HTML 返回给浏览器。

后端服务化的优点
  便于分工协作:后端可以按自己的进度开发接口,前端可以开发页面,需要的时候直接调用后端 API ;
  便于项目拓展:比如前期是做的网站,后续要加一个 APP ,后端接口可以直接复用;
  降低服务端压力:后端只提供数据,一部分业务逻辑在前端处理了。服务端要做的事情少了,自然压力就小。

模板引擎的优点
  模板引擎开发的页面,对搜索引擎 SEO 比较友好;简单的页面用模板引擎开发速度比较快,毕竟模板化的方法,目的就是减少重复提高效率。

4.3 Spring Boot 中常用的模板引擎

  Spring Boot 支持的模板引擎种类很多,常见的有 FreeMarker 、 Thymeleaf 、 JSP 。下面以为Thymeleaf例开发一个商品浏览项目。

4.4 项目实例

1)创建 Spring Boot 项目:略

2)在 pom.xml 中引入相关依赖

       <!-- 引入web项目相关依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- ThymeLeaf依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>

3)创建控制器方法,指向商品页面
  创建控制器类, GoodsController , Thymeleaf 直接使用 HTML 作为模板页面,故代码如下:

/**
 * 商品控制器
 */
@Controller // 标注为控制器
public class GoodsController {
	/**
	 * 获取商品列表
	 */
	@RequestMapping("/goods") // 请求路径
	public String goods() {
		return "goods.html";// 跳转到goods.html页面
	}
}

4)创建商品页面
  在 resource/templates 目录下新建商品页面 goods.html ,先不必实现具体功能,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商品列表</title>
</head>
<body>
商品列表
</body>
</html>

  此时我们启动项目,然后访问 http://127.0.0.1:8080/goods ,即可显示对应页面内容。

5)在控制器方法中,调用服务方法获取商品信息,并将信息交给模板引擎处理
商品类 GoodsDo 代码:

/**
 * 商品数据对象
 */
public class GoodsDo {
	/**
	 * 商品名称
	 */
	private String name;
	/**
	 * 商品价格
	 */
	private String price;
	/**
	 * 商品图片
	 */
	private String pic;
  // 省略get set方法
}

服务类 GoodsService代码:

/**
 * 商品服务
 */
@Service // 为GoodsService注册一个组件
public class GoodsService {
	public List<GoodsDo> getGoodsList() {
		List<GoodsDo> list = new ArrayList<GoodsDo>();
		GoodsDo goods = new GoodsDo();
		goods.setName("苹果");
		goods.setPic("apple.jpg");
		goods.setPrice("3.5");
		list.add(goods);
		return list;
	}
}

此时我们的控制器就可以注入 GoodsService 类型的组件,然后调用其方法了。

@Controller
public class GoodsController {
	@Autowired
	private GoodsService goodsService;// 自动装配

	@RequestMapping("/goods") // 请求路径
	public String goods(Model model) {
		model.addAttribute("goodsList", goodsService.getGoodsList());// 交给模板引擎处理的数据
		return "goods.html";// 跳转到goods.html页面
	}
}

6)在商品页面通过模板引擎规则显示商品信息
  此时我们可以根据 Thymeleaf 模板引擎,按模板规则显示商品信息了。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>商品列表</title>
</head>
<body>
	<div>商品列表:</div>
	<div th:each="item:${goodsList}">
		<span th:text="${item.name}"></span> 
		<span th:text="${item.price}"></span>
		<span th:text="${item.pic}"></span>
	</div>
</body>
</html>

  注意我们通过 Thymeleaf 的模板语法,输出了商品列表信息。

7)测试
  启动项目,打开浏览器访问 http://127.0.0.1:8080/goods ,即可查看输出结果。

5 Spring Boot 开发 RESTful 风格 Web 项目

5.1 前后端分离

  前后端分离这种概念和技术,早就流行多年了。具体点说,前端编写 HTML 页面,然后通过 Ajax 请求后端接口;后端把接口封装成 API ,返回 JSON 格式的数据;前端接收到 JSON 返回数据后渲染到页面。
  前端工程师不需要懂后端,调用后端接口就行。后端使用 Spring Boot 控制器返回 JSON 十分简单,给方法添加个注解,就能将返回值序列化为 JSON 。
  前端干前端的活,后端干后端的活,职责分明,界限明确。

5.2 RESTful 风格后端接口

  做后端接口的公司这么多,如果大家都定义自己的规范,是不利于公司之间的合作的。如果大家都能遵循一个规范来开发接口,相关人员都能省心不少。RESTful 就是一种非常流行的 HTTP 接口规范,简单明了,使用的人也多。

5.3 项目实例

1)根据需求制定 RESTful 风格的接口文档
  这里同样实现一个商品浏览页面,将商品增删改查都实现,接口文档如下:

动词接口含义接口地址
GET查询商品 (id=1) 信息http://127.0.0.1:8080/goods/1
GET查询商品列表信息http://127.0.0.1:8080/goods
POST新增商品http://127.0.0.1:8080/goods
PUT修改商品 (id=1) 信息http://127.0.0.1:8080/goods/1
DELETE删除商品 (id=1)http://127.0.0.1:8080/goods/1

  Tips: RESTful 风格通过 HTTP 动词( GET / POST / PUT / DELETE )区分操作类型。

2)按文档开发后端 API 接口
  相比于使用模板引擎,用 Spring Boot 开发后端接口便捷很多。通过给控制器添加注解,就能将控制器方法返回值序列化为 JSON 。

①创建SpringBoot项目:略
②引入项目依赖
  RESTful 项目其实就是标准的 Web 项目,引入 Web 项目依赖即可。

        <!-- 引入web项目相关依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

③创建商品类与商品服务类
创建商品类代码:

/**
 * 商品类
 */
public class GoodsDo {
	/**
	 * 商品id
	 */
	private Long id;
	/**
	 * 商品名称
	 */
	private String name;
	/**
	 * 商品价格
	 */
	private String price;
	/**
	 * 商品图片
	 */
	private String pic;
  //省略get set方法
}

创建商品服务类代码

/**
 * 商品服务
 */
@Service // 注册为服务类
public class GoodsService {
	/**
	 * 获取商品列表
	 */
	public List<GoodsDo> getGoodsList() {
		List<GoodsDo> goodsList = new ArrayList<GoodsDo>();
		GoodsDo goods = new GoodsDo();
		goods.setId(1L);
		goods.setName("苹果");
		goods.setPic("apple.jpg");
		goods.setPrice("3.5");
		goodsList.add(goods);
		return goodsList;
	}
	/**
	 * 按id获取商品信息,模拟返回对应商品信息
	 */
	public GoodsDo getGoodsById(Long id) {
		GoodsDo goods = new GoodsDo();
		goods.setId(1L);
		goods.setName("苹果");
		goods.setPic("apple.jpg");
		goods.setPrice("3.5");
		return goods;
	}
	/**
	 * 新增商品,模拟返回数据库影响行数
	 */
	public int addGoods(GoodsDo goods) {
		return 1;
	}
	/**
	 * 根据商品id更新商品信息,模拟返回数据库影响行数
	 */
	public int editGoods(GoodsDo goods) {
		return 1;
	}
	/**
	 * 根据商品id删除对应商品,模拟返回数据库影响行数
	 */
	public int removeGoods(Long id) {
		return 1;
	}
}

  Tips: 服务层方法,建议不要使用 select /insert/update /delete 命名,因为服务层处理的逻辑往往不止于关系数据库表的增删改查。此处采用的是 get /add/edit /remove 。

④根据 API 文档实现控制器方法

@RestController // 通过该注解,第一是将GoodsController注册为控制器,可以响应Http请求;第二是可以将控制器中的方法返回值序列化为json格式。
public class GoodsController {
	@Autowired // 自动装配goodsService
	private GoodsService goodsService;
	/**
	 * 查询商品信息 
	 * 1、@GetMapping表示可以使用get方法请求该api
	 * 2、"/goods/{id}"表示请求路径为/goods/{id}的形式,其中{id}为占位符
	 * 3、@PathVariable("id")表示将占位符{id}的值传递给id 
	 * 4、也就是说/goods/123请求的话,会将123传递给参数id
	 */
	@GetMapping("/goods/{id}")
	public GoodsDo getOne(@PathVariable("id") long id) {
		return goodsService.getGoodsById(id);
	}
	/**
	 * 查询商品列表,使用get方法
	 */
	@GetMapping("/goods")
	public List<GoodsDo> getList() {
		return goodsService.getGoodsList();
	}
	/**
	 * 新增商品 
	 * 1、@PostMapping表示使用post方法
	 * 2、@RequestBody表示将请求中的json信息转换为GoodsDo类型的对象信息,该转换也是由SpringMVC自动完成的
	 */
	@PostMapping("/goods")
	public void add(@RequestBody GoodsDo goods) {
		goodsService.addGoods(goods);
	}
	/**
	 * 修改商品
	 */
	@PutMapping("/goods/{id}")
	public void update(@PathVariable("id") long id, @RequestBody GoodsDo goods) {
		// 修改指定id的商品信息
		goods.setId(id);
		goodsService.editGoods(goods);
	}
	/**
	 * 删除商品
	 */
	@DeleteMapping("/goods/{id}")
	public void delete(@PathVariable("id") long id) {
		goodsService.removeGoods(id);
	}
}

3)使用 Postman 测试 API 接口可用
  后端开发完 API 接口后,需要先进行下简单测试以保证接口是正确可用的。这里使用 Postman 进行简单测试。启动 Spring Boot 项目后,使用 Postman 进行可视化测试,此处结果如下:
在这里插入图片描述
  测试查询商品信息

ps:以上内容来自对慕课教程的学习与总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值