SpringBoot Notes
迪丽瓦拉
2024-05-26 07:14:03
0

文章目录

  • 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数据访问操作,包含数据的增、删、改、查

三层架构的好处

  1. 复用性强
  2. 便于维护
  3. 利用扩展

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的区别

  • @Autowiredspring框架提供的注解,而**@ResourceJDK提供**的注解
  • @Autowired 默认是按照类型注入,而**@Resource按照名称注入**

相关内容