文章目录
SpringBootWeb入门
概述
- 静态资源:在服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。(HTML、CSS、JS 以及图片、音频、视频等)
- 动态资源:在服务器端上存储的,会根据用户请求和其他数据动态生成的,内容可能会在每次请求时都发生变化。
- BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。
- CS架构:Client/Server,客户端/服务器架构模式。需要单独开发维护客户端。
- SpringBoot 是基于 Spring 框架的开发工具包,它简化了 Spring 应用的创建与开发。 Spring官网
HTTP协议
HTTP概述
- HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。
- HTTP协议特点:
- 基于TCP协议: 面向连接,安全
- 基于请求-响应模型: 一次请求对应一次响应(先请求后响应)
- HTTP协议是无状态协议: 对于数据没有记忆能力。每次请求-响应都是独立的
HTTP请求协议
格式介绍
-
请求协议:浏览器将数据以请求格式发送到服务器。包括:请求行、请求头 、请求体。
-
请求行 :HTTP请求中的第一行数据。由:请求方式、资源路径、协议/版本组成(之间使用空格分隔)
-
常见HTTP请求头
- 请求体 :存储请求参数(GET请求的请求参数在请求行中,故不需要设置请求体)
- GET请求和POST请求的区别:
获取请求数据
- 获取请求数据:
Web服务器(Tomcat)对HTTP协议的请求数据进行解析,并进行了封装(HttpServletRequest) ,并在调用Controller方法的时候传递给了该方法。这样,就使得程序员不必直接对协议进行操作,让Web开发更加便捷。
HTTP响应协议
格式介绍
- 响应协议:服务器将数据以响应格式返回给浏览器。包括:响应行 、响应头 、响应体。
- 响应行:响应数据的第一行。响应行由协议及版本、响应状态码、状态码描述组成。
- 响应头:响应数据的第二行开始。格式为key:value形式。
- 响应体: 响应数据的最后一部分。存储响应的数据。(响应体和响应头之间有一个空行隔开(作用:用于标记响应头结束))
响应状态码
- 200 ok 客户端请求成功
- 404 Not Found 请求资源不存在
- 500 Internal Server Error 服务端发生不可预期的错误
分层解耦
三层架构
介绍
- 单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。(这样就可以让类、接口、方法的复杂度更低,可读性更强,扩展性更好,也更利于后期的维护。)
- 项目开发中可以将代码分为三层
- Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
- Service:业务逻辑层。处理具体的业务逻辑。
- Dao:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。
代码拆分
- 控制层包名:com.itheima.controller
- 创建UserController类(调用Service,响应数据)
- 业务逻辑层包名:com.itheima.service
- 创建UserSerivce接口
- 在 com.itheima.service.impl 中创建UserSerivceImpl接口(调用UserDao)
- 数据访问层包名:com.itheima.dao
- 创建 UserDao接口
- com.itheima.dao.impl 中创建UserDaoImpl接口
分层解耦
- 内聚:软件中各个功能模块内部的功能联系。
- 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
- 软件设计原则:高内聚低耦合。(目的是使程序模块的可重用性、移植性大大增强。)
- 解耦思路:
- 不在EmpController中使用new对象
- 将要用到的对象交给一个容器管理。
- 应用程序中用到这个对象,就直接从容器中获取
IOC&DI入门
- 控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器)。
- 依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
- bean对象:IOC容器中创建、管理的对象,称之为:bean对象。
- 将Service及Dao层的实现类,交给IOC容器管理,在实现类加上 @Component 注解,就代表把当前类产生的对象交给IOC容器管理。
- 使用 @Autowired 为Controller 及 Service注入运行时所依赖的对象。
IOC详解
- Spring框架为了更好的标识web应用程序开发当中bean对象到底归属于哪一层,提供了 @Component的衍生注解:
- 前面声明bean的四大注解,要想生效,还需要被组件扫描注解 @ComponentScan 扫描。
- 该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。
注意:将项目中的所有的业务类,都放在启动类所在包的子包中,就无需考虑组件扫描问题。
DI详解
- @Autowired 进行依赖注入,常见的方式,有如下三种:
- 属性注入:代码简洁、方便快速开发。(但隐藏了类之间的依赖关系、可能会破坏类的封装性。)
@RestController
public class UserController {
//方式一: 属性注入
@Autowired
private UserService userService;
}
- 构造函数注入:能清晰地看到类的依赖关系、提高了代码的安全性。(但代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。)
@RestController
public class UserController {
//方式二: 构造器注入
private final UserService userService;
@Autowired //如果当前类中只存在一个构造函数, @Autowired可以省略
public UserController(UserService userService) {
this.userService = userService;
}
}
- setter注入:保持了类的封装性,依赖关系更清晰。(但需要额外编写setter方法,增加了代码量。)
@RestController
public class UserController {
//方式三: setter注入
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
}
- 注意:若IOC容器中,存在多个相同类型的bean对象,需要让框架知道具体注入哪个bean对象。有如下三种方法:
- 使用@Primary注解
@Primary
@Service
public class UserServiceImpl implements UserService { }
- 使用@Qualifier注解
@RestController
public class UserController {
@Qualifier("userServiceImpl")
@Autowired
private UserService userService;
}
- 使用@Resource注解
@RestController
public class UserController {
@Resource(name = "userServiceImpl")
private UserService userService;
注意:@Autowird 与 @Resource的区别
- @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
- @Autowired 默认是按照类型注入,而@Resource是按照名称注入
注:本篇文章是基于黑马程序员的《JavaWeb+AI》b站课程做的学习笔记