一、IOC控制反转
使用对象是由主动new产生对象,转化为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转
- 业务层要想使用数据层的对象,以前都是自己new
- 现在自己不new 了,交给外部来创建对象
- 外部旧反转控制了数据层对象的创建权
Spring 提供了一个容器,IOC容器,用来充当思想中“外部”
二、DI依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
- 业务层要使用数据层的对象,以前都是自己new
- 现在自己不new 了,交给IOC容器来注入进来
三、AOP
AOP:面向切面编程
作用:在不惊动原始设计的基础上为其进行功能增强
AOP工作流程:
- Spring容器启动
- 读取所有切面配置中的切入点
- 初始化bean
- 获取bean执行方法
AOP核心概念:
- 目标对象(Target):原始功能去掉共性功能对应的类产生的对象,也可称为原始对象
- 代理(Proxy):目标对象无法直接完成功能,需要对其进行功能回填,通过原始对象的代理对象实现
AOP切入点表达式:
- 语法格式:动作关键字(访问修饰符 返回值 包名.类名/接口名.方法(参数类型))异常名
execution(void com.demo.dao.impl.BookDaoImpl.update())
execution(public User com.demo.service.UserService.findById(int))
通配符:
- *? 单个独立的任意符号:可以独立出现,也可以作为前缀或后缀的匹配符出现
execution(public * com.demo.*.UserService.find*(*))
// 匹配com.demo包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法
- ?..? ?多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
execution(public User com..UserService.findById())
// 匹配com包下任意包中的UserService类或接口中所有名称为findById的方法
execution(* *..*Service+.*(..))
// *Service+ 表示所有以Service结尾的接口的子类
?
AOP通知类型:
- 前置通知:追加功能到方法执行前
- 后置通知:追加功能到方法执行后,不管方法执行的过程中有没有抛出异常都会执行
- 返回后通知:追加功能到方法执行后,只有方法正常执行结束后才进行,如果方法抛出异常,返回后通知将不会被添加
- 抛出异常后通知:追加功能到方法执行后,只有方法正常执行结束后才进行,如果方法抛出异常,只有方法抛出异常后才会被添加
- 环绕通知:追加功能到方法执行的前后,它可以实现其他四种通知类型的功能。
AOP事务管理:
- 事务作用:在数据层保障一系列的数据库操作同成功同失败
- Spring事务作用:在数据层或业务保障一系列的操作的数据库操作同成功同失败
|