Spring Boot知识点整理(上)

Spring Boot

默认大于配置

一、MAVEN

POM(Project Object Model,项目对象模型)

它是Maven工程的基本工作单元,也是Maven的核心。它是一个XML文件,包含项目的基本信息,用于描述项目如何构建、声明项目依赖等。POM中通常有以下元素:

  • dependencies
    在此元素下添加依赖,它可以包含多个依赖。

  • dependency
    <dependency></dependency>之间有3个标识,分别如下:

    • groupId:定义隶属的实际项目,坐标元素之一。
    • artifactId:定义项目中的一个模块,坐标元素之一。
    • version:依赖或项目的版本,坐标元素之一。
  • scope

    • 如果有一个在编译时需要而发布时不需要的JAR包,则可以用scope标签标记该包,并将其值设为provided。
    • scope标签的参数
参数描述
compilescope的默认值,表示被依赖项目需要参与当前项目的编译、测试、运行阶段,是一个比较强的依赖。打包时也要包含进去
providedprovided表示打包时可以不用打包进去,Web Container会提供。该依赖理论上可以参与编译、测试、运行等周期
runtime表示dependency不作用在编译阶段,但会作用在运行和测试阶段,如JDBC驱动适合运行和测试阶段
system和provided相似,但是在系统中要以外部JAR包的形式提供,Maven不会在repository中查找它
test表示dependency作用在测试阶段,不作用在运行阶段。只在测试阶段使用,用于编译和运行测试代码。不会随项目发布
  • properties
    如果要使用自定义的变量,则可以在<properties></properties>元素中进行变量的定义,然后在其它节点中引用该变量。它的好处是:在依赖配置时引用变量,可以达到统一版本号的目的。

  • plugin
    在创建Spring Boot项目时,默认提供了spring-boot-maven-plugin插件。它提供打包时需要的信息,将Spring Boot应用打包为可执行的JAR或WAR文件。

  • 完整的pom.xml文件

二、Lombok注解简介

  • @Data:自动生成Getter/Setter、toString、equals、hashCode方法,以及不带参数的构造方法。
  • @NonNull:帮助处理NullPointerException。
  • @CleanUp:自动管理资源,不用再在finally中添加资源的close方法。
  • @Setter/@Getter:自动生成Getter/Setter方法。
  • @ToString:自动生成toString方法。
  • @EqualsAndHashcode:从对象的字段中重写hashCode和equals方法。
  • @NoArgsConstructor/@RequiredArgsonstructor/@AllArgsConstructor:自动生成构造方法。
  • @Value:用于注解final类。
  • @Builder:产生复杂的构建器API类。
  • @SneakyThrows:用于处理异常。
  • @Synchronized:同步方法的转化。
  • @Log:支持使用各种日志(logger)对象。只要在使用时,用对应的注解进行标注。比如使用Log4j作为日志库,则在需要加入日志的位置写上注解@Log4j即可。

三、MVC模式

1. MVC概念

Model(模式)、View(视图)、Controller(控制器)的简写。

  • Model:是JAVA的实体Bean,代表存取数据的对象或POJO(Plain Ordinary Java Objects,简单的Java对象),也可以带有逻辑。其作用是在内存中暂时存储数据,并在数据变化时更新控制器(如果要持久化,则需要把它写入数据库或者磁盘文件中)。

  • View:主要用来解析,处理、显示内容,并进行模板渲染。

  • Controller:主要用来处理视图中的响应。它决定如何调用Model(模型)的实体Bean、如何调用业务层的数据增加、删除、修改和查询等业务操作,以及如何将结果返给视图进行渲染。建议在控制器中尽量不让业务逻辑代码。

2. 整个工程流程
  • 客户端(用户)发出的请求有Tomcat(服务器)接收,然后Tomcat将请求转交给DispatcherServlet处理。
  • DispatcherServlet匹配控制器中配置的映射路径,进行下一步处理。
  • ViewResolver将ModelAndView或Exception解析成View。然后View会调用render()方法,并根据ModelAndView中的数据渲染出页面。

四、三层架构

三层架构,就是将整个应用程序划分为表现层(UI)、业务逻辑层(Service)、数据访问层(DAO/Repository)。

1. 表现层
  • 用于展示界面。主要对用户的请求进行接受,以及进行数据的返回。它为客户端(用户)提供应用程序的访问接口(界面)。
2. 业务逻辑层
  • 是三层架构的服务层,负责业务逻辑处理,主要是调用DAO层对数据进行增加、删除、修改和查询等操作。
3. 数据访问层
  • 与数据库进行交互的持久层,被Service调用。在Spring Data JPA中Hibernate来实现。

五、Spring MVC控制器中常使用的注解

1. @Controller

@Controller标记在类上。使用@Controller标记的类表示是Spring MVC的Controller对象。分发处理器将会扫描使用了该注解的类,并检测其中的方法是否使用了注解@RequestMapping。注解@Controller只是定义了一个控制器类,使用了注解@RequestMapping的方法才是真正处理请求的处理器,完成映射关系。

2. @RestController

@RestController是Spring 4.0之后才有的注解。它等价于原来的注解@Controller加上注解@ResonseBody的功能,直接返回字符串。用它来标注Rest风格的控制器类。

3. @RequestMapping
  • 它用来处理请求地址映射的注解,可用在类或方法上。如果用在类上,则表示类中的所有响应请求的方法都以该地址作为父路径。

  • RequestMapping注解有6个属性

    • value:指定请求的地址。
    • method:指定请求的method类型——GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。
    • consumes:消费消息,指定处理请求的提交内容类型(Content-Type),例如application/json、text/html。
    • produces:生产消息,指定返回的内容类型。仅当request请求头中的Accept类型中包含该指定类型时才返回。
    • params:指定request中必须包含某些参数值才让该方法处理请求。
    • headers:指定request中必须包含某些指定的header值才能让该方法处理请求。
@PathVariable

将请求URL中的模板变量映射到功能处理方法的参数上,即获取URL中的变量作为参数。

六、处理HTTP请求的方法

RequestMapping的method类型有GET、HEAD、POST、PUT、PATCH、DELETE、OPTIONS、TRACE。可以通过这些method来处理前端用不同方法提交的数据。

1. GET

用GET方法可以获取资源。

2. DELETE

如果需要删除一个数据,根据Restful风格则需要使用DELETE方法。在使用DELETE方法删除资源时,要注意判断是否成功,因为返回的是VOID方法。一般有以下三个方法进行判断:

  • 使用try catch exception:如果不发生异常,则默认为成功,但是这样并不好。
  • 通过存储过程返回值来判断是否正确执行:如果执行成功,则返回1或大于0的值;如果执行失败,则返回0;
  • 在执行DELETE方法前先查询是否有数据:在执行DELETE方法后返回值是0,所以一般先查询一下是否有数据。
3. POST

如果需要添加对象,那一般使用POST方法传递一个Model对象。

tips:GET和POST的区别
  • GET在浏览器中可以回退,而POST访问同一个地址时也是再次提交请求。
  • GET请求会被浏览器主动缓存,而POST不会。
  • GET中的参数会被完整地保留在浏览器历史记录里,而POST中的参数则不会被保留。
  • GET只能进行URL编码,而POST支持多种编码方式。
  • GET只接收ASCII字符,而POST没有限制。
  • GET的安全性相比POST低,因为参数直接暴露在URL上,所以不能用它传递敏感信息。
  • GET的参数是通过URL传递的,而POST的参数是放在request body中的。
4. PUT

如果对象需要更新,则用PUT方法发送请求。

5. PATCH

PATCH是一个新引入的方法,是对PUT方法的补充,用来对已知资源进行局部更新。

6. OPTIONS

该方法用于获取当前URL。若请求成功,则会在HTTP头中包含一个名为"Allow"的头,其值是所支持的方法,如值为“GET,POST”。它还允许客户端查看服务器的性能。如果遇到“500错误”,则OPTIONS不进行第二次请求。

7. TRACE

它显示服务器收到的请求,主要用于测试或诊断。

七、Spring AOP

1. 什么是AOP

AOP(Aspect Oriented Program,面向切面编程)把业务功能分为核心、非核心两部分。

  • 核心业务功能:用户登录、增加数据、删除数据。
  • 非核心业务:性能统计、日志、事务管理。

在Spring的面向切面编程(AOP)思想里,非核心业务功能被定义为切面。核心业务功能和切面功能先被分别进行独立开发,然后把切面功能和核心业务功能”编织“在一起,这就是AOP。

2. AOP中的概念
  • 切入点(pointcut):在哪些类、哪些方法上切入。
  • 通知(advice):在方法前、方法后、方法前后做什么。
  • 切面(aspect):切面 = 切入点 + 通知。即在什么时机、什么地方、做什么。
  • 织入(weaving):把切面加入对象,并创建出代理对象的过程。
  • 环绕通知:AOP中最强大、灵活的通知,它集成了前置和后置通知,保留了连接点原有的方法。

八、IoC容器

IoC(Inversion of Control)容器概念

是面向对象编程中的一种设计原则,意为控制反转(也被称为“控制反向”或“控制倒置”)。它将程序中创建的对象的控制权交给Spring框架来管理,以便降低计算机代码之间的耦合度。

  • 控制反转的实质是获得依赖对象的过程被反转了。这个过程由自身管理变为IoC容器主动注入。这正是IoC实现的方式之一:依赖注入(dependency injection, DI),由IoC容器在运行期间动态地将某种依赖关系注入对象之中。
IoC容器的实现方法主要有两种
  • 依赖注入
    IoC容器通过类型或名称等信息将不同对象注入不同属性中。组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。这是最流行的IoC方法。依赖注入主要有以下几种方法。

    • 设值注入(setter injection): 让IoC容器调用注入所依赖类型的对象。
    • 接口注入(interface injection): 实现特定接口,以供IoC容器注入所依赖类型的对象。
    • 构造注入(constructor): 实现特定参数的构造函数,在创建对象时让Ioc容器注入所依赖类型的对象。
    • 基于注解: 通过Java的注解机制让IoC容器注入所依赖类型的对象,例如,使用@Autowired。
      IoC是通过第三方容器来管理并维护这些被依赖对象的,应用程序只需要接收并使用IoC容器注入的对象。
  • 依赖查找
    依赖查找则通过调用容器提供的回调接口和上下文环境来获取对象,在获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态。依赖查找通常有两个方法——依赖拖曳(DP)和上下文依赖查找(CDL)。

九、Servlet容器

Servlet是在javax.servlet包中定义的一个接口。在开发Spring Boot应用程序时,使用Controller基本能解决大部分的功能需求。但有时也需要使用Servlet,比如实现拦截和监听功能。

十、过滤器与监听器

1. 认识过滤器

在很多Web项目中,都会用到过滤器(Filter),如参数过来、防止SQL注入、防止页面攻击、空参数矫正、Token验证、Session、点击率统计等

如何使用Filter
  1. 新建类,实现Filter抽象方法
  2. 重写init、doFilter、destroy方法
  3. 在Spring Boot入口中添加注解@ServletComponentScan,以注册Filter
tips

在重写3个方法后,还可以进一步修改request参数使用的封装方法,如:

  1. 编写ParameterRequestWrapper类继承HttpServletRequestWrapper类
  2. 编写ParameterRequestWrapper类构造器
  3. 在构造器中覆写父类构造器,并将request.getParameterMap加入子类的成员变量
  4. 编写addParam方法
  5. 修改参数并调用ParameterRequestWrapper实例,并保存params
  6. 调用doFilter方法中的FilterChain变量,以重新封装修改后的request
2. 认识监听器

监听器(Listener)用于监听Web应用程序中某些对象或信息的创建、销毁、增加、修改、删除等动作,然后做出相应的响应处理。当对象的状态发生变化时,服务器自动调用监听器的方法,监听器常用于统计在线人数、在线用户、系统加载时的信息初始化等

Servlet中的监听器分为以下3三种类型

  • 监听ServletContext、Request、Session作用域的创建和销毁

    • ServletContextListener:监听ServletContext
    • HttpSessionListener:监听新的Session创建事件
    • ServletRequestListener:监听ServletRequest的初始化和销毁
  • 监听ServletContext、Request、Session作用域中属性的变化(增加、修改、删除)

    • ServletContextAttributeListener:监听Servlet上下文参数的变化
    • HttpSessionArrtibuteListener:监听HttpSession参数的变化
    • ServletRequestAttributeListener:监听ServletRequest参数的变化
  • 监听HttpSession中对象状态的改变(被绑定、解除绑定、钝化、活化)

    • HttpSessionBindingListener:监听HttpSession,并绑定及解除绑定
    • HttpSessionActivationListener:监听钝化和活动的HttpSession状态改变
如何实现监听器
  1. 创建监听类

    通过注解@WebListener标注此类是监听类

  2. 开启监听器Bean扫描

    在入口类上,添加注解@ServletComponentScan

十一、元注解

元注解就是定义注解的注解,是Java提供的用于定义注解基本注解

注解说明
@Retention是注解类,实现声明类Class,声明类别Category,声明扩展Extension
@Target放在自定义注解的上边,表明该注解可以使用的范围
@Inherited允许子类继承父类的注解,在子类中可以获取使用父类的注解
@Documented表明这个注解是由Javadoc记录的
@interface用来自定义注释类型
1. @Target

该注解的作用是告诉Java将自定义的注解放在什么地方,比如类、方法、构造器、变量上等。它的值是一个枚举类型,有如下属性值

  • ElementType.CONSTRUCTOR:用于表述构造器
  • ElementType.FIELD:用于描述成员变量、对象、属性(包括enum实例)
  • ElementType.LOCAL_VARIABLE:用于描述局部变量
  • ElementType.METHOD:用于描述方法
  • ElementType.PACKAGE:用于描述包
  • ElementType.PARAMETER:用于描述参数
  • ElementType.TYPE:用于描述类、接口(包括注解类型)或enum声明
2. @Retention

该注解用于说明自定义注解的生命周期,在注解中有三个生命周期

  • RetentionPolicy.RUNTIME:始终不会丢弃,运行期也保留该注释,可以使用反射机制读取该注解的信息。自定义的注解通常使用这种方式
  • Retention.CLASS:类加载时丢弃,默认使用这种方式
  • Retention.SOURCE:编译阶段丢弃,自定义注解在编译结束之后就不再有意义,所以它们不会写入字节码。@Overide、@SuppressWarnings都属于这类注释
3. @Inherited

该注解是一个标记注解,表明被标注的类型是可以继承的。如果一个使用了@Inherited修饰的Annotation类型被用于一个Class,则这个Annotation将被用该Class的子类

4. @Documented

该注解表示是否将注解信息添加在Java文档中

5. @interface

该注解用来声明一个注解,其中的每个方法实际上是声明了一个配置参数。方法的名称就是参数的名称,返回值类型就是参数的类型(返回值类型只能是基本类型、Class、String、enum)。可以通过default来声明参数的默认值

定义注解格式见以下代码

public @interface 注解名 {定义体}

学习尚硅谷视频整理的文档 Spring Boot 1 1 Spring Boot入门 4 1.1 简介 4 1.2 微服务(martin fowler发表了一篇文章) 5 1.3 环境约束 7 1.4 第一个Spring Boot项目(jar):HelloWorld 8 1.5 入门案例详解 11 1.5.1 POM文件 11 1.5.2 主程序类,主入口类 12 1.6 使用Spring Initializer向导快速创建Spring Boot 16 2 Spring Boot配置 18 2.1 配置文件 18 2.2 YML语法 19 2.3 YML配置文件值获取 21 2.4 properties配置文件乱码问题 24 2.5 @ConfigurationProperties与@Value的区别 25 2.6 配置@PropertySource、@ImportResource、@Bean 27 2.7 配置文件占位符 30 2.8 Profile多环境支持 31 2.9 配置文件的加载位置 33 2.10 外部配置加载顺序 36 2.11 自动配置原理 37 2.12 @Conditional派生注解 41 3 Spring Boot与日志 42 3.1 日志框架分类和选择 42 3.2 SLF4j使用 43 3.3 其他日志框架统一转换成slf4j+logback 44 3.4 Spring Boot日志使用 45 3.5 Spring Boot默认配置 47 3.6 指定日志文件和日志Profile功能 52 3.7 切换日志框架(不使用SLF4j+LogBack) 54 4 Spring Boot与Web开发 55 4.1 Web开发简介 55 4.2 静态资源映射规则 56 4.3 引入Thymeleaf 60 4.4 Thymeleaf语法 61 4.5 SpringMVC自动配置原理 67 4.6 SpringBoot扩展与全面接管 70 4.7 如何修改SpringBoot默认配置 72 4.8 【实验】CRUD操作 73 4.8.1 默认访问首页 73 4.8.2 登录页面国际化 74 4.8.3 登录 80 4.8.4 拦截器进行登录检查 81 4.8.5 实验要求(没按要求做,不想改了!) 82 4.8.6 CRUD-员工列表 83 4.8.7 CRUD-员工修改 86 4.8.8 CRUD-员工添加 87 4.8.9 CRUD-员工删除 88 4.9 错误处理原理&错误页面定制 90 4.10 配置嵌入式Servlet容器(springboot 1.50版本) 97 4.10.1 如何定制和修改Servelt容器的相关配置 97 4.10.2 注册servlet三大组件【servlet,filter,listener】 98 4.10.3 替换为其他嵌入式容器 102 4.10.4 嵌入式servlet容器自动配置原理 103 4.10.5 嵌入式servlet容器启动原理 103 4.11 使用外置的Servlet容器 104 4.11.1 步骤 104 4.11.2 原理 107 5 Spring Boot与Docker(虚拟化容器技术) 110 5.1 简介 110 5.2 核心概念 111 5.3 安装Docker 112 5.4 Docker常用命令&操作 113 5.5 安装MySQL示例 114 6 Spring Boot与数据访问 115 6.1 JDBC 115 6.1.1 实现 115 6.1.2 自动配置原理 116 6.2 整合Durid数据源 117 6.3 整合Mybatis 122 6.3.1 注解版 123 6.3.2 配置文件版 124 6.4 整合SpringData JPA 125 6.4.1 SpringData简介 125 6.4.2 整合 126 7 Spring Boot启动配置原理 128 7.1 启动流程(Springboot 1.50版本) 128 7.1.1 创建SpringApplication对象 129 7.1.2 运行run方法 130 7.1.3 编写事件监听机制 132 8 Spring Boot自定义starters 136 8.1 概述 136 8.2 步骤 137 9 更多Springboot整合示例 144 10 Spring Boot与缓存 145 10.1 JSR107缓存规范 145 10.2 Spring的缓存抽象 146 10.2.1 基本概念 146 10.2.2 整合项目 146 10.2.3 CacheEnable注解 148 10.2.4 Cache注解 150 10.3 整合redis 154 10.3.1 在Docker上安装redis 154 10.3.2 Redis的Template 154 10.3.3 整合(百度) 155
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HardyZhan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值