spring学习笔记(多图)
核心
IOC
控制反转:把对象的创建交给spring的配置来实现
AOP
面向切面:扩展功能而不是修改源代码
ioc的两种实现
第一种:配置文件方式实现ioc
ioc的底层原理是:
- xml配置文件
- dom4j解析xml文件
- 工厂设计模式
- 反射
对象创建
下图展示了三种创建方式的实现:分别是调用需创建的类的无参构造函数、调用工厂类的静态方法、调用工厂类的非静态方法:
image.png属性的注入
-
有参构造函数
-
set方法注入
image.png -
注入属性一般常用于注入对象属性,如在service里面把dao作为类属性注入
实现方法:
- 在service声明dao属性
- 生成dao属性的set方法
- 在配置文件中注入关系
(要先有dao的对象生成,然后才能注入)
- 注入复杂类型的属性
在类里面声明这些类型的属性
image.png
-
数组
image.png -
list集合
image.png -
map映射
image.png - properties配置 java.util.Properties
第二种:注解方式实现IOC
注解可以使用在类、方法、属性上面
-
导入jar包
image.png - 创建类和方法
- 创建spring配置文件,引入约束
- 开启注解扫描
-
使用注解
image.png
spring常用注解
- @Component
- @Controller :web层
- @Repository :持久层
- @Service :业务层
下面三个注解是Component的衍生注解,目前功能是一样的,后续版本会增强
若要创建多实例的,加上scope的注解(默认是单例)
这些注解目前是一样的作用 image.png image.png
注解注入属性的方式一:使用注解Autoweired
image.png
常用方式 是 注解和配置混合使用
创建对象用配置文件
注入对象属性使用注解方式
这里的属性注入用Resource注解,是第二种注入属性的注入方式
image.png
log4jlog4j
image.png image.png解决每次都要加载xml配置的问题
上面那张图是默认去加载spring的位置和默认加载的xml名字,而我们没有在默认位置下创建xml,所以需要另外配置加载的路径。
AOP
aop概念
- 面向切面编程,扩展功能不需要修改源代码
- aop采用横向抽取机制,取代纵向继承体系重复性代码
名词解释
- 连接点:类里面哪些方法可以被增强,这些方法叫做连接点
-
通知/增强:增强的逻辑,称为增强,比如上面扩展的日志功能,这个日志功能叫做增强
前置通知:在方法之前执行
后置通知:在方法之后执行
异常通知:方法出现异常
最终通知:在后置之后执行
环绕通知:在方法之后和之前执行
image.png - 切面:把增强应用在具体方法上面,过程叫做切面(增强用到切入点的过程)
- 切入点:实际被增强的方法
使用表达式配置切入点
横向抽取机制理解
采用纵向机制解决功能扩展时,需要调用父类的方法:
image.png
横向抽取机制:
-
有接口的情况,使用jdk动态代理
image.png -
没有接口的情况,使用cglib动态代理
image.png
spring实现aop
- 在spring里面实现aop,使用aspectj实现
(1)aspectj不是spring的一部分
(2)spring2.0以后才增加了对aspectj的支持 - 使用aspectj有两种方式
(1)xml配置
(2)注解方式
第一种:xml配置方式实现aop
- 准备操作
除了导入基本的jar包之外,还需要导入aop相关的jar包
-
在xml中要导入aop的约束
image.png -
增加相关的类 ,mybook是实现扩展功能的类,book是需要扩展功能的类
image.png
-
xml配置
先创建book和mybook类的对象
然后配置切入点、切面和增强类型(before是mybook类中的方法)
image.png
环绕增强方式的实现:
要加入proceedingJoinPoint.proceed();
image.png image.png image.png第二种:使用注解实现aop
-
在xml里面创建对象
image.png -
在xml里面开启aop操作
image.png -
在增强类上面使用注解完成aop操作
类及方法上注解
image.png
jdbcTemplate
- spring是一站式框架
(1)针对javaee三层,每一层都有解决技术
(2)针对到层,使用jdbcTemplate - spring对不同的持久化技术都进行了封装
- jdbcTemplate对数据库进行crud操作
实现
-
导入相关jar包
image.png - 创建对象,设置数据库信息
- 创建jdbcTemplate对象,设置数据源
- 调用jdbcTemplate对象里面的方法实现操作
增加:
使用的是update方法
image.png
注意导入的包是这里面的
image.png
更新:
使用的是update方法
删除:
使用的是update方法
查询:
有不同需要的查询,分别是查询返回一个值,查询返回一个对象,查询返回一个集合
-
查询返回一个值
这里是返回个数
使用queryForObject方法
image.png -
查询返回一个对象
使用queryForObject方法
第一个参数是sql语句
第二个参数是RowMapper接口,具体实现类需要我们自己写
第三个是可变参数
- 查询返回一个集合
使用query方法,返回的是list集合
第一个参数是sql语句
第二个参数是RowMapper接口,具体实现类需要我们自己写(这个方法用上面的返回对象的查询操作的)
第三个是可变参数
xml配置数据库连接池
-
导入jar包
image.png -
xml配置数据库连接池
原来代码中是这样写的
image.png
现在使用xml代替
image.png
- 用xml创建jdbjTemplate对象
-
使用jdbcTemplate对象,是在dao层使用,我们用xml配置方式注入属性来实现
image.png
事务管理
事务的知识点请查看:https://www.jianshu.com/p/38620844538a
事务管理方式有两种
- 编程式事务管理(一般不用)
- 声明式事务管理
(1)基于xml配置方式实现
(2)基于注解实现
spring事务管理api
spring实现事务管理的api是PlatFormTransacionManager接口,并且为不同的dao层框架提供了具体的实现类
image.png声明式事务管理的实现
第一种: xml配置方式实现
- 配置事务管理器(dataSource是上面图的数据库连接池的xml配置)
- 配置事务增强(method name=account*表示account开头的方法都被匹配 propagation为隔离级别)
-
配置切面
image.png
第二种: 注解方式实现
- 配置事务管理器
-
开启事务注解
image.png -
在类上使用注解
image.png