后端 | Spring 入门(基于 Spring4)

本贴最后更新于 1018 天前,其中的信息可能已经事过景迁

Spring 介绍

Spring 核心主要两部分

(1)AOP: 面向切面编程,横向扩展功能,不改动原有代码。

(2)IOC: 控制反转。

  • 传统:创建类对象的过程,需要 new 出来对象
  • IOC:把对象的创建不是通过 new 方式实习,而是交给 Spring 配置创建类对象

Spring 是一站式框架,在 JavaEE 三层结构中,每一层都提供不同的解决技术

  • 界面层(User Interface layer)(jsp)
  • 业务逻辑层(Business LogicLayer)(javaclass)
  • 数据访问层(Data access layer)(jdbc)

web 层:SpringMVC

service 层:Spring 的 ioc

dao 层:Spring 的 jdbcTemplate

Spring 的 ioc 操作

1.把对象的创建交给 Spring 进行管理

2.ioc 操作两部分:

(1)ioc 的配置文件方式

(2)ioc 的注解方式

IOC 底层原理

1.ioc 底层原理使用技术

(1)XML

(2)dom4j 解决 XML

(3)工厂设计模式

(4)反射

2.画图分析 IOC 原理

New→ 工厂模式解耦 →ioc

image.png

image.png

IOC 入门案例

第一步 导入 jar 包
做 spring 最基本功能的时候,只需要导入 4 个核心 jar 包就可以了,导入支持日志输出的 jar 包
image.png

第二步 创建类,在类里面创建方法

image.png

第三步 创建 Spring 配置文件,配置创建类

(1)Spring 核心配置文件名称和位置不是固定的

建议放到 src 下面,官方建议 applicationContext.xml

(2)引入 schema 约束

image.png

(3)配置对象

image.png

第四步 写代码测试对象创建
这段代码在测试中使用

image.png

Spring 的 bean 管理(xml 方式)

Bean 实例化的方式

在 spring 里面通过配置文件创建对象

bean 实例化三种方式实现

第一种 使用类的无参数构造创建(重点)

类里面没有无参的构造方法,出现异常

image.png

第二种 使用静态工厂创建

创建静态的方法,返回类对象

image.png

image.png

第三种 使用实例工厂创建

创建不是静态的方法,返回类的对象

image.png

image.png

Bean 标签常用属性

(1)Id 属性: 起名称,id 属性值任意命名

id 的属性值,不能包含特殊符号

根据 id 值得到配置对象

(2)Class 属性: 创建对象所在类的全路径

(3)Name 属性: 功能和 id 属性一样的,id 的属性值不能包含特殊符号,但是在 name 属性值里面可以包含特殊符号(不用了)

(4)Scope 属性: Bean 的作用范围

singleton 默认值,单例
image.png
image.png

prototype 多例的

image.png
image.png

request 创建对象把对象放到 request 域中

session 创建对象把对象放到 session 域中

globalSession 创建对象把对象放到 globalSession 域中

属性注入

1.创建对象时候,向类里面属性里面设置值

2.属性注入的方式介绍(三种方式)

  • (1)使用 set 方法注入
  • (2)使用有参数构造注入
  • (3)使用接口注入
    image.png

在 spring 框架里面,支持前两种方式

  • (1)set 方法注入(重点)
  • (2)有参数构造注入

使用有参数构造注入属性

image.png

image.png

使用 set 方法注入属性(重点)

image.png
image.png

注入对象类型属性(重点)

创建 service 类和 dao 类具体实现过程

(1)在 service 里面把 dao 作为类型属性

(2)生成 dao 类型属性的 set 方法

image.png

(3)配置文件中注入关系

image.png

image.png

P 名称空间注入

image.png

image.png

注入复杂类型属性

  • 数组
  • List 集合
  • Map 集合
  • Properties 类型

image.png

IOC 和 DI 区别

(1)IOC:控制反转,把对象创建交给 Spring 进行配置

(2)DI:依赖注入,向类里面的属性中设置值

(3)关系:IoC 主要的实现方式有两种:依赖查找,依赖注入。依赖注入不能单独存在,需要 ioc 基础之上完成操作,它们是 spring 核心思想的不同方面的描述。

Spring 整合 web 项目原理

  1. 加载 Spring 核心配置文件

image.png

  1. 实现思想:把加载配置文件和创建对象过程,在服务器启动时完成
  2. 实现原理
  • (1)ServletContext 对象
  • (2)监听器
  • (3)具体使用
  1. 具体流程

在服务器启动时候,为每个项目创建一个 ServletContext 对象

在 ServletContext 对象创建时候,使用监听器可以具体到 ServletContext 对象在什么时候创建

使用监听器听到 ServletContext 对象创建时候,

加载 Spring 配置文件,把配置文件配置对象创建

把创建出来的对象放到 ServletContext 域对象里面(setAttribute 方法)

获取对象时候,到 ServletContext 域得到(getAttribute 方法)

Spring 的 bean 管理(注解)

注解介绍

  1. 代码里面特殊标记,使用注解可以完成功能
  2. 注解写法 @ 注解名称(属性名称=属性值)
  3. 注解使用在类上面,方法上面和属性上面

Spring 注解开发准备

  1. 导入 jar 包

(1)导入基本 jar 包
image.png

image.png

image.png

image.png

image.png

(2)导入 aop 的 jar 包

image.png

  1. 创建类,创建方法
  2. 创建 spring 配置文件,引入约束

(1)第一次项目做 ioc 基本功能引入的约束是 beans

(2)做 spring 的 ioc 注解开发,引入新的约束

image.png

  1. 开启注解扫描

image.png

注解创建对象

在创建对象的类上面使用注解实现

image.png

image.png

创建对象有四个注释

@Component:组件

@Controller:web 层

@Service:业务层

@Repository:持久层

这四个注解功能是一样的,都创建对象,后续版本做扩展

创建对象单实例还是多实例

image.png

注解注入属性

创建 service 类,创建 dao 类,在 service 得到到对象

注入属性第一个注解 @Autowired

(1)创建 dao 和 service 类

image.png

image.png

(2)在 service 类里面定义 dao 类型属性

image.png

注入属性第二个注解 @Resource

image.png

配置文件和注解混合使用

  1. 创建对象操作使用配置文件方式实现

image.png

  1. 注入属性的操作使用注解方式实现(@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,而 @Resource 默认按** byName 自动注入**罢了。)

image.png
spring 不但支持自己定义的 @Autowired 注解,还支持几个由 JSR-250 规范定义的注解,它们分别是 @Resource、@PostConstruct 以及 @PreDestroy。

AOP 概念

AOP:面向切面(方面)编程,在不修改原本业务的前提下对方法进行增强

AOP 采取横行抽取机制,取代了传统纵向继承体系重复性代码

AOP 原理

画图分析原理

(Springboot2.X 默认使用 gclib 模式,Springboot 官方他们认为使用 cglib 更不容易出现转换错误)

image.png

image.png

image.png

AOP 操作术语

Joinpoint(连接点): 类里面那些方法可以被增强,这些方法称为连接点,因为 spring 只支持方法类型的连接点。如:类开始初始化前、类初始化后、类的某个方法调用前、类的某个方法调用后、方法抛出异常后等。

Pointcut(切入点): 切点是指我们要对那些 Joinpoint 进行拦截,切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。

Advice(通知/增强): 所谓通知是只拦截到 Joinpoint 之后所要做的事情就是通知,通知分为

前置通知(Before)后置通知(After)返回通知(After-returning) 异常通知(After-throwing)环绕通知(Around)

Aspect(切面): 是切入点和通知(引介)的结合

Introduction(引介): 引介是一种特殊的通知在不修改类代码的前提下,Introduction 可以在运行期为类动态的添加一些方法或 Field

Target(目标对象): 代理的目标对象(要增强的类)

Weaving(织入): 是把增强应用到目标的过程。把 advice 应用到 target 的过程

Proxy(代理): 一个类被 AOP 织入增强后,就产生一个结果代理类

image.png

Spring 的 AOP 操作

  1. 在 Spring 里面进行 AOP 操作,使用 aspectj 实现

(1)aspectj 不是 Spring 一部分,和 Spring 一起使用进行 aop 操作

(2)Spring2.0 以后新增了对 AspectJ 支持

  1. 使用 Aspectj 实习 AOP 有两种方式

(1)基于 aspectj 的 xml 配置

(2)基于 aspectj 的注解方式

AOP 操作准备

  1. 除了导入最基本的 jar 包外,还需要导入 AOP 相关的 jar 包

image.png

aspectjweaver-1.8.13.jar 文件在 IDEA 创建 Spring 项目中,没有,需要自己导入

image.png

  1. 创建 Spring 核心配置文件,导入 AOP 的约束

image.png

使用表达式配置切入点

  1. 切入点:实际增强的方法
  2. 常用的表达式

Execution(< 访问修饰符 >?< 返回类型 >< 方法名 >(< 参数 >)< 异常 >)

(1)execution(*xyz.hcworld.aop.Book.add(..)) 代表可以是 public 或 protected 或 private

(2)execution(*xyz.hcworld.aop.Book.*(..)) 对所有方法

(3)execution(**.*(..))全部类的全部方法

(4)execution(*save*(..)) 匹配所有 save 开头的方法
3. 通配符 *代表所有

Aspectj 的 aop 操作

image.png

image.png

image.png

image.png

Log4j 介绍(建议使用 Log4j2,异步打印日志性能高)

  1. 通过 log4j 可以看到程序运行过程中更详细的信息,经常使用 log4j 查看日志
  2. 使用

(1)导入 log4j 的 jar 包

image.png

(2)负责 log4j 的配置文件复制到 src 下面

image.png

  1. 设置日志级别

image.png

(1)info:看到基本信息

(2)debug:可以看到更详细信息。

基于 aspectj 的注解 AOP

第一步创建对象

image.png

第二步在 Spring 核心配置文件中,开启 AOP

image.png

第三步在增强类上面使用注解完成 AOP 操作

image.png

Spring 的事务管理

事务概念

1 什么事务

事务包含一个或多个业务操作,这些操作要么都执行,要么都不执行。事务常被用来确保数据的一致性。

2 事务特性

1. 原子性 (atomicity):强调事务的不可分割.
2. 一致性 (consistency):事务的执行的前后数据的完整性保持一致.
3. 隔离性 (isolation):一个事务执行的过程中,不应该受到其他事务的干扰
4. 持久性(durability) :事务一旦结束,数据就持久到数据库

3 不考虑隔离性产生读问题

1. 脏读 :一个事务读到了另一个事务的未提交的数据
2. 不可重复读 :一个事务读到了另一个事务已经提交的 update 的数据导致多次查询结果不一致.
3. 虚(幻)读 :一个事务读到了另一个事务已经提交的 insert 的数据导致多次查询结果不一致.

4 解决读问题: 设置事务隔离级别(5 种)

DEFAULT 这是一个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别.

1. 未提交读(read uncommited) :脏读,不可重复读,虚读都有可能发生
2. 已提交读 (read commited):避免脏读。但是不可重复读和虚读有可能发生
3. 可重复读 (repeatable read) :避免脏读和不可重复读.但是虚读有可能发生.
4. 串行化的 (serializable):避免以上所有读问题.

Mysql 默认:可重复读

Oracle 默认:读已提交

Spring 事务管理 API

1 Spring 事务管理两种方式

第一种 编程式事务管理(一般不用)

第二种 声明式事务管理(主要)

(1)基于 xml 配置文件实现

(2)基于注解实现

2 Spring 事务管理的 API 介绍

主要三个接口

PlatformTransactionManager

事务管理器

(1)spring 针对不同的 dao 层框架,提供接口不同的实现类

org.springframework.jdbc.datasource.DataSourceTransactionManager

使用 SpringJDBC 或 Mybatis 进行持久化数据时使用

org.springframework.orm.hibernate5.HibernateTransactionManager

使用 Hibernate5.0 版本进行持久化数据时使用

(2)配置事务管理器

搭建转账环境

  1. 创建数据库表,添加数据

image.png

  1. 创建一个 service 和 dao 类,完成注入关系

image.png

(1)service 层又叫业务逻辑层

(2)dao 层,单纯对数据库操作层,在 dao 层不添加业务

(3)需求:小王转账 1000 给小马

  • 小王少 1000
  • 小马多 1000

image.png

image.png

  1. 产生问题:如果小王少了 1000 之后,出现异常,小马不会多 1000,钱丢失了
  2. 解决: 添加事务解决,出现异常进行回滚操作

声明式事务管理(xml 配置)

第一步 配置事物管理器

image.png

第二步 配置事务的增强

image.png

第三步配置切面

image.png

声明式事务管理(注解)

第一步 配置事务管理器

image.png

第二步 配置事务注解

image.png

第三步在使用事务的方法所在类上添加注解

image.png

  • 笔记

    好记性不如烂笔头。

    304 引用 • 777 回帖
  • 后端
    45 引用 • 126 回帖 • 1 关注
  • 框架
    47 引用 • 346 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...