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
IOC 入门案例
第一步 导入 jar 包
做 spring 最基本功能的时候,只需要导入 4 个核心 jar 包就可以了,导入支持日志输出的 jar 包
第二步 创建类,在类里面创建方法
第三步 创建 Spring 配置文件,配置创建类
(1)Spring 核心配置文件名称和位置不是固定的
建议放到 src 下面,官方建议 applicationContext.xml
(2)引入 schema 约束
(3)配置对象
第四步 写代码测试对象创建
这段代码在测试中使用
Spring 的 bean 管理(xml 方式)
Bean 实例化的方式
在 spring 里面通过配置文件创建对象
bean 实例化三种方式实现
第一种 使用类的无参数构造创建(重点)
类里面没有无参的构造方法,出现异常
第二种 使用静态工厂创建
创建静态的方法,返回类对象
第三种 使用实例工厂创建
创建不是静态的方法,返回类的对象
Bean 标签常用属性
(1)Id 属性: 起名称,id 属性值任意命名
id 的属性值,不能包含特殊符号
根据 id 值得到配置对象
(2)Class 属性: 创建对象所在类的全路径
(3)Name 属性: 功能和 id 属性一样的,id 的属性值不能包含特殊符号,但是在 name 属性值里面可以包含特殊符号(不用了)
(4)Scope 属性: Bean 的作用范围
singleton 默认值,单例
prototype 多例的
request 创建对象把对象放到 request 域中
session 创建对象把对象放到 session 域中
globalSession 创建对象把对象放到 globalSession 域中
属性注入
1.创建对象时候,向类里面属性里面设置值
2.属性注入的方式介绍(三种方式)
- (1)使用 set 方法注入
- (2)使用有参数构造注入
- (3)使用接口注入
在 spring 框架里面,支持前两种方式
- (1)set 方法注入(重点)
- (2)有参数构造注入
使用有参数构造注入属性
使用 set 方法注入属性(重点)
注入对象类型属性(重点)
创建 service 类和 dao 类具体实现过程
(1)在 service 里面把 dao 作为类型属性
(2)生成 dao 类型属性的 set 方法
(3)配置文件中注入关系
P 名称空间注入
注入复杂类型属性
- 数组
- List 集合
- Map 集合
- Properties 类型
IOC 和 DI 区别
(1)IOC:控制反转,把对象创建交给 Spring 进行配置
(2)DI:依赖注入,向类里面的属性中设置值
(3)关系:IoC 主要的实现方式有两种:依赖查找,依赖注入。依赖注入不能单独存在,需要 ioc 基础之上完成操作,它们是 spring 核心思想的不同方面的描述。
Spring 整合 web 项目原理
- 加载 Spring 核心配置文件
- 实现思想:把加载配置文件和创建对象过程,在服务器启动时完成
- 实现原理
- (1)ServletContext 对象
- (2)监听器
- (3)具体使用
- 具体流程
在服务器启动时候,为每个项目创建一个 ServletContext 对象
在 ServletContext 对象创建时候,使用监听器可以具体到 ServletContext 对象在什么时候创建
使用监听器听到 ServletContext 对象创建时候,
加载 Spring 配置文件,把配置文件配置对象创建
把创建出来的对象放到 ServletContext 域对象里面(setAttribute 方法)
获取对象时候,到 ServletContext 域得到(getAttribute 方法)
Spring 的 bean 管理(注解)
注解介绍
- 代码里面特殊标记,使用注解可以完成功能
- 注解写法 @ 注解名称(属性名称=属性值)
- 注解使用在类上面,方法上面和属性上面
Spring 注解开发准备
- 导入 jar 包
(1)导入基本 jar 包
(2)导入 aop 的 jar 包
- 创建类,创建方法
- 创建 spring 配置文件,引入约束
(1)第一次项目做 ioc 基本功能引入的约束是 beans
(2)做 spring 的 ioc 注解开发,引入新的约束
- 开启注解扫描
注解创建对象
在创建对象的类上面使用注解实现
创建对象有四个注释
@Component:组件
@Controller:web 层
@Service:业务层
@Repository:持久层
这四个注解功能是一样的,都创建对象,后续版本做扩展
创建对象单实例还是多实例
注解注入属性
创建 service 类,创建 dao 类,在 service 得到到对象
注入属性第一个注解 @Autowired
(1)创建 dao 和 service 类
(2)在 service 类里面定义 dao 类型属性
注入属性第二个注解 @Resource
配置文件和注解混合使用
- 创建对象操作使用配置文件方式实现
- 注入属性的操作使用注解方式实现(@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,而 @Resource 默认按** byName 自动注入**罢了。)
spring 不但支持自己定义的 @Autowired 注解,还支持几个由 JSR-250 规范定义的注解,它们分别是 @Resource、@PostConstruct 以及 @PreDestroy。
AOP 概念
AOP:面向切面(方面)编程,在不修改原本业务的前提下对方法进行增强
AOP 采取横行抽取机制,取代了传统纵向继承体系重复性代码
AOP 原理
画图分析原理
(Springboot2.X 默认使用 gclib 模式,Springboot 官方他们认为使用 cglib 更不容易出现转换错误)
AOP 操作术语
Joinpoint(连接点): 类里面那些方法可以被增强,这些方法称为连接点,因为 spring 只支持方法类型的连接点。如:类开始初始化前、类初始化后、类的某个方法调用前、类的某个方法调用后、方法抛出异常后等。
Pointcut(切入点): 切点是指我们要对那些 Joinpoint 进行拦截,切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。
Advice(通知/增强): 所谓通知是只拦截到 Joinpoint 之后所要做的事情就是通知,通知分为
前置通知(Before)后置通知(After)返回通知(After-returning) 异常通知(After-throwing)环绕通知(Around)
Aspect(切面): 是切入点和通知(引介)的结合
Introduction(引介): 引介是一种特殊的通知在不修改类代码的前提下,Introduction 可以在运行期为类动态的添加一些方法或 Field
Target(目标对象): 代理的目标对象(要增强的类)
Weaving(织入): 是把增强应用到目标的过程。把 advice 应用到 target 的过程
Proxy(代理): 一个类被 AOP 织入增强后,就产生一个结果代理类
Spring 的 AOP 操作
- 在 Spring 里面进行 AOP 操作,使用 aspectj 实现
(1)aspectj 不是 Spring 一部分,和 Spring 一起使用进行 aop 操作
(2)Spring2.0 以后新增了对 AspectJ 支持
- 使用 Aspectj 实习 AOP 有两种方式
(1)基于 aspectj 的 xml 配置
(2)基于 aspectj 的注解方式
AOP 操作准备
- 除了导入最基本的 jar 包外,还需要导入 AOP 相关的 jar 包
aspectjweaver-1.8.13.jar 文件在 IDEA 创建 Spring 项目中,没有,需要自己导入
- 创建 Spring 核心配置文件,导入 AOP 的约束
使用表达式配置切入点
- 切入点:实际增强的方法
- 常用的表达式
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 操作
Log4j 介绍(建议使用 Log4j2,异步打印日志性能高)
- 通过 log4j 可以看到程序运行过程中更详细的信息,经常使用 log4j 查看日志
- 使用
(1)导入 log4j 的 jar 包
(2)负责 log4j 的配置文件复制到 src 下面
- 设置日志级别
(1)info:看到基本信息
(2)debug:可以看到更详细信息。
基于 aspectj 的注解 AOP
第一步创建对象
第二步在 Spring 核心配置文件中,开启 AOP
第三步在增强类上面使用注解完成 AOP 操作
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)配置事务管理器
搭建转账环境
- 创建数据库表,添加数据
- 创建一个 service 和 dao 类,完成注入关系
(1)service 层又叫业务逻辑层
(2)dao 层,单纯对数据库操作层,在 dao 层不添加业务
(3)需求:小王转账 1000 给小马
- 小王少 1000
- 小马多 1000
- 产生问题:如果小王少了 1000 之后,出现异常,小马不会多 1000,钱丢失了
- 解决: 添加事务解决,出现异常进行回滚操作
声明式事务管理(xml 配置)
第一步 配置事物管理器
第二步 配置事务的增强
第三步配置切面
声明式事务管理(注解)
第一步 配置事务管理器
第二步 配置事务注解
第三步在使用事务的方法所在类上添加注解
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于