文章目录
- 1 SpringBootWeb快速入门
- 1.1Spring官网
- 1.2 Web分析
- 2. HTTP协议
- 2.1 HTTP介绍
- 3
- 4 SpringBootWeb请求响应
- 5 响应
- 6 分层解耦
- 6.1 三层架构
- 6.1.1 三层架构介绍
- 6.1.2 基于三层架构的程序执行流程:
- 6.1.3 代码拆分
- 6.2 分层解耦
- 6.2.1 内聚、耦合
- 6.2.2 解耦思路
- 6.3 IOC&DI
- 6.3.1 IOC详解
- 6.3.1.1 bean的声明
- 6.3.1.2 组件扫描
- 6.1.2 DI详解
1 SpringBootWeb快速入门
1.1Spring官网
https://spring.io
spring家族的技术,都是基于SpringFramework的,SpringFramework中提供很多实用功能,如:依赖注入、事务管理、web开发支持、数据访问、消息服务等。
1.2 Web分析
浏览器
和服务器
两端进行数据交互,使用http协议
2. HTTP协议
2.1 HTTP介绍
HTTP:Hyper Text Transfer Protocol(超文本传输协议),规定了浏览器与服务器之间数据传输的规则。
3
4 SpringBootWeb请求响应
5 响应
6 分层解耦
6.1 三层架构
6.1.1 三层架构介绍
在我们进行程序设计及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。
单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。
根据上述案例的处理逻辑呢,从组成上分为三部分:
数据访问
:负责业务数据的维护操作,包括增、删、改、查等操作。逻辑处理
:负责业务逻辑处理的代码。请求处理、响应数据
:负责,接收页面的请求,给页面响应数据。
按照上述三个组成部分,在我们项目开发中呢,可以将代码分为三层:
Controller
:控制层。接收前端发送的请求,对请求进行处理,并响应数据。Service
:业务逻辑层。处理具体的业务逻辑。Dao
:数据访问层(Data Access Object),也称为持久层。负责数据访问操作,包括数据的增、删、改、查。
6.1.2 基于三层架构的程序执行流程:
- 前端发起请求,由Controller层接收(Controller响应数据给前端)
- Controller层调用Service层来进行逻辑处理(Service层处理完后,把处理结果返回给Controller层)
- Serivce层调用Dao层(逻辑处理过程中需要用到的数据从Dao层获取)
- Dao层操作文件中数据(Dao拿到的数据会返回给Service层)
6.1.3 代码拆分
包名 | 备注 | 作用 |
---|---|---|
控制层包名 | xxxx.controller | 接收前端发送请求,对请求进行处理,并响应数据 |
业务逻辑层包名 | xxxx.service | 处理业务逻辑 |
数据访问层包名 | xxxx.dao | 数据访问操作,包含数据的增、删、改、查 |
三层架构的好处:
- 复用性强
- 便于维护
- 利用扩展
6.2 分层解耦
6.2.1 内聚、耦合
内聚:软件中各个功能模块内部的功能联系。
耦合:衡量软件中各个层/模块间的依赖、关联的程度。
软件设计原则:高内聚低耦合。
6.2.2 解耦思路
解决思路是:
- 提供一个容器,容器中存储一些对象(例:EmpService对象)
- controller程序从容器中获取EmpService类型的对象
实现上述解耦操作,涉及到Spring中的两个核心概念:
控制反转
:( Inversion Of Control,简称IOC)。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
依赖注入
:(Dependency Injection,简称DI)。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。IOC容器中创建、管理的对象,称之为:bean对象
6.3 IOC&DI
6.3.1 IOC详解
6.3.1.1 bean的声明
IOC控制反转,就是将对象的控制权交给Spring的
IOC容器
,由IOC容器创建及管理对象。IOC容器创建的对象称为bean对象。
要把某个对象交给IOC容器管理,需要在类上添加注解:@Component
为了更好标识web应用程序中bean对象到归属于哪层,又提供了@Component的衍生注解
@Controller
(标注在控制层类上)@Service
(标注在业务层类上)@Repository
(标注在数据访问层类上)
注解 | 说明 | 位置 |
---|---|---|
@Controller | @Component的衍生注解 | 标注在控制器类上 |
@Service | @Component的衍生注解 | 标注在业务类上 |
@Repository | @Component的衍生注解 | 标注在数据访问类上(由于与mybatis整合,用的少) |
@Component | 声明bean的基础注解 | 不属于以上三类时,用此注解 |
6.3.1.2 组件扫描
bean想要生效,需要被组件扫描
运行程序后,报错:
为什么没有找到bean对象呢?
- 使用四大注解声明的bean,
要想生效
,需要被组件扫描注解@ComponentScan扫描
@ComponentScan注解没有显式配置,但实际上已经包含在引导类声明注解 @SpringBootApplication 中,默认扫描的范围是SpringBoot启动类所在包及其子包。如下结构扫描全部:
6.1.2 DI详解
依赖注入,指
IOC容器
要为应用程序提供运行时所依赖的资源
,而资源
指的就是对象
。
@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)
入门程序举例:在EmpController运行时,要到IOC容器中找EmpService类型的对象,而IOC容器中刚好有EmpService类型的对象,所以就找到了这个类型的对象完成注入操作。
那如果在IOC容器中,存在多个相同类型的bean对象,会出现什么情况呢?
程序运行会报错
如何解决上述问题呢?Spring提供了以下几种解决方案:
- @Primary
使用@Primary注解:当存在多个相同类型的Bean注入时,加上@Primary注解,来确定默认的实现。
- @Qualifier
使用@Qualifier注解:指定当前要注入的bean对象。 在@Qualifier的value属性中,指定注入的bean的名称。- @Qualifier注解不能单独使用,必须配合@Autowired使用
- @Resource
使用@Resource注解:是按照bean的名称进行注入。通过name属性指定要注入的bean的名称。
面试题 : @Autowird 与 @Resource的区别
- @Autowired 是spring框架提供的注解,而**@Resource是JDK提供**的注解
- @Autowired 默认是按照类型注入,而**@Resource是按照名称注入**