- Spring
- 1. Spring简介
- 介绍
- 下载
- 导入
- 优点
- 2. Spring的组成和拓展
- 七大模块
- 缺点
- 3. IOC理论推导
- 介绍
- 4. IOC本质
- 逻辑
- 5. HelloSpring
- 代码验证
- bean
- 概念
- 底层源码
- 完整路径
- 什么是IOC
- 属性赋初值
- 使用
- 6. IOC创建对象的方式
- 是在什么地方new的?
- 使用步骤
- 如何使用有参构造方法
- 总结
- 7. Spring配置说明
- 别名
- Bean的配置
- import
- 8. DI : 依赖注入环境
- 注入方式
- set注入
- 可以注入的类型
- 代码
- 9. 依赖注入之set注入
- 10. c命名和p命名空间注入
- p命名空间
- 测试
- c命名空间
- 11. Bean的作用域
- 单例
- 原型
- Web里的几个
- 12. 自动装配Bean
- 自动装配
- 三种自动装配方式
- 自动装配代码
- XML中显式
- 自动装配
- 总结
- 13. 注解实现自动装配
- 注解须知
- 注入
- 总结
- 14. Spring注解开发
- bean
- 属性如何注入
- 衍生的注解
- 自动装配的注解
- 作用域
- 小结
- 15. 使用JavaConfig实现配置
- Config类
- 16. 回顾
- 17. 静态代理模式
- 代理模式
- 介绍
- 静态代理
- 四大角色,分析
- 代码
- 代理模式的分析
- 好处
- 缺点
- 18. 静态代理再理解
- 集中管理公共业务
- 面向切面
- 19. 动态代理详解
- 如何改变缺点
- 动态代理介绍
- InvocationHandler
- Proxy
- 代码,动态生成代理
- 步骤
- 具体操作
- 可以写一个任意的处理类
- 总结动态代理
- 20. AOP实现方式一
- 什么是AOP
- AOP在Spring的作用
- 名词解释
- 使用Spring实现AOP
- Log类为例
- 21. AOP实现方式二:自定义类
- AOP实质
- AOP实现
- AOP在Spring中的作用
- 总结两种方式
- 22. 方式三:注解实现AOP
- 配置
- before
- 注册
- around
- 执行顺序
- 总结
- 23. 回顾MyBatis
- 步骤
- 回忆Mybatis
- 24. 整合MyBatis,方式一
- 为什么要用 MyBatis - Spring
- 配置
- 使用
- 总结,哪些MyBatis的部分被摒弃了
- 核心是
- 25. 整合MyBatis,方式二
- 26. 事务回顾
- 事务介绍
- 代码实现
- 27. Spring中的事务
- 两种事务介绍
- 编程式事务
- 声明式事务:AOP
- 使用声明式事务
- 结合AOP,实现事务的织入
- 配置事务本身的特性
- 配置AOP,把配置好的事务切入进去类和方法
先把自己的目标总结在前面,尽量快的学
- 概念
- 注意点
- 几个关键点
- new的对象被简化没了
- 什么是框架,相当于一个模版
- 是个大杂烩
- 开源免费的容器(框架)
- 轻量级、非入倾式的
- 控制反转(IOC)、面向切面编程(AOP)
- 支持事务的处理,整合了很多内容,大杂烩
- 内核
- AOP
- ORM ,对象关系,映射 MyBatis
- DAO
- Web
- Context
- Spring MVC
- 配置太繁琐
- IOC是一种思想
- 传统开发
- 接口+实现类
- Dao层
- 业务层
- 用户
- 三层架构
- 每次加一个功能要写三个层的类
- 接口+实现类
- 如何解决这个问题
- 设计模式 - 能不能程序不变,调用变化
- 设置接口,set方法
- 前者,程序主动创建对象
- 后者,使用set注入,程序不需要变,谁调用也不用改
- 结论
- 程序员不用管理对象的创建(new)
- 耦合性大大降低
- 更专注于业务实现
- 控制反转:控制权的问题,不交出去
- 只有使用权
- 以前的开发模式
- 用户访问业务层
- 主动权在业务层
- 业务层访问具体类
- 具体类不论怎么改,用户是不用变
- 主动权在业务层,业务层选择具体类
- 硬编码
- 现在的开发模式,主动权在用户
- 用户只需要实现具体类
- 第三方
- 两层的联系,现在变成了一个接口
- 弱化了联系
- 看不到new
- 写出一个实体类
- XML/注解 来配置
- 相当于一个容器
- 使用Spring来创建对象
- 对象称为bean
- 直接使用
- 对象都在Spring中管理了
- 直接取出来
- 相当于从容器取出来
- id相当于变量名
- class相当于new的对象
- property相当于给对象中的属性设置值
- 以上整个过程称为控制反转
- 控制
- 谁来控制对象的创建:Spring
- 反转
- 程序不创建对象,变为接受对象
- 依赖注入
- 利用set方法来注入的
- set方法去掉之后就报错
ApplicationContext context =
new ClassPathXmlApplicationContext(“xml文件名”)
- new 的是 ClassPathXmlApplicationContext
- 怎么变成的 ApplicationContext
- 继承,继承,继承,继承,继承,实现了一个接口
- 对象由Spring创建、管理、装配
- 属性名:property
- 对象类型的值:ref
- value:基本数据类型
- get方法就行
- 在getBean方法时候
- 每写一个类就丢入xml中
- 属性再注入
- 拿到容器
- get方法
- 默认是午餐构造方法
- 如何使用有参构造
- 方式1,参数的位置
- constructor-arg
- index(位置)
- value 值
- 方式2,参数的类型
- constructor-arg
- type
- value
- 方式3,直接通过参数名
- constructor-arg
- name
- value
- 在配置文件初始化时
- 对象就被初始化了
- 按下<,自己弹出的
- 多个名字
- 相当于对象的名字
- 一样用
- id : bean的唯一标识符,相当于对象名
- class : bean对象对应的类型
- name : 也是别名,和有参构造不一样
- 可以取多个别名
- 可以用分隔符,逗号、分号
- scope :默认是单例
- 一般用于团队开发
- 把多个配置文件导入合并为一个
- 可以导入多个beans.xml
- 构造器
- set【重点】
- 拓展方式
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象的所有属性,由容器注入
- 普通类型
- value
- 对象类型(引用类型)
1. - List
- Map
- Set
- 配置类 Properties
- 空指针
- 在类中声明这些
- 设置set方法
- 注入 -> 具体注入
- 普通注入
- value,
- 可以放在单个标签内部<内部>
- 也可以放在标签对,的里面
- 对象注入
- ref=
- bean的名字
- 数组注入
- property,是大大名字
- 在property标签的里面
- array
- 每一个是value
- 或者bean
- List注入
- 同数组
- Map
- < entry
- 里面是key 和 value
- Set
- 只有一个value
- null
- 直接< null >
- Properties
- props
- prop
- key在< 里面 >
- value在外面
- driver
- url等
- props
- 是拓展
- 导入一些约束,导入别的命名空间
- 导入p 的 namespace
- p:名字=值
- 是直接注入
- 相当于property
- 导入junit包
- 拿到容器
- 打点来get
- 导入c 的 namespace
- c:名字=值
- 是构造器,相当于construct-args
- 不论几个Dao,只有一个Bean
- 不论getBean几个
- 每次getBean不一样
- 打印hashCode
- request
- session
- application
- 不需要设置,也能找到
- Spring满足Bean依赖的一种方式
- Spring会在上下文中自动寻找并自动装配属性
- XML中显式
- 在Java中显式
- 隐式的自动装配
- 创建项目
- 三个实体类
- dog
- 有shout方法
- cat
- 有shout方法
- people
- 拥有cat和dog和name
- XML文件
- 注入三个类,和类的属性
- 测试
- 只需要new一次,new获取容器的东西
- 在bean的属性里加一个autowire
- byName
- byType
- byName
- 会自动在容器里找和set名字
- 相同的名字
- byType
- 和自己对象属性相同的
- byName
- 要bean的id唯一
- 这个bean和注入的属性名字一致
- byType
- 要bean的class唯一
- 这个bean和注入的属性类型一致
- 导入约束
- 加一个命名空间
- 最后面加上4句
- 配置上加上个支持
- 在属性的上面一行
- 加上@AutoWired
- 也可以在set方法上面一行用
- 甚至可以不需要set方法(因为是靠反射)
- 科普
- @NUllable加在参数前
- 这个字段可以为null
- 加参数
- @AutoWired(null)
- @NUllable加在参数前
- 如果自动装配的环境比较复杂 无法通过一个注解完成
- @Qualifier(value=“”)
- 名字要一致
- @Resource
- 先通过id来找,名字
- 再通过class找,包
- 有多个时
- 指定装配
- (value=“名字”)
- @AutoWired和@Resource的区别
- 都是用来自动装配
- 都可以放在属性的上面一行
- @AutoWired通过byName
- @Resource
- 默认byName(先),找不到会用byType(后)
- 找不到才报错
- 如果不能为一对应名字
- 用@Qualifier
- 在Spring4之后,想使用注解,必须导入AOP包
- 注解没用时要检查AOP包
- 使用注解要导入约束
- 加上支持
- 扫描所在包用到的注解
- 使用@Component
- 装配
- 配置文件中就不需要< bean
- 也相当于new了一下
- 使用@Value(“值”)
- 相当于< property
- 也可以放在set方法上面一行
- @Component有几个衍生的注解
- 按照mvc三层架构分层
- dao层
- @Repository
- 也相当于@Component
- 但是Dao层习惯用@Repository
- service层
- @Service
- controller层
- @Controller
上一章
作用域- Scope
- 单例 : singleton
- 原型 : prototype
- XML更加万能,维护方便
- 注解:不是自己的类,维护不了
- 最佳实践
- xml用来管理bean
- 注解只用来属性
- 使用过程只需要注意
- 注解支持不要忘记
- 否则注解不生效
- 可以使用java配置类,来等价于xml
- 还比xml更加灵活
- 在类名上方加上@Configuration
- 类里面写上get方法
- 加上注解@Bean,就相当于之前写的一个bean标签
- 方法的名字,相当于标签中的id
- 返回值,相当于标签中的class,就是要注入的对象
- 也可以扫描@ComponentScan(“包”)
- 加上注解@Bean,就相当于之前写的一个bean标签
- 再去要被注入的Bean里
- 加上注解@Component
- 使用,获取容器
- 只能通过
- ApplicationContext =
- AnnotationConfig 上下文来获取来容器
- 参数为Class对象
- xml中的import标签
- 注解 @import(类)
- 设计模式
- 是Spring AOP的底层
- 分为静态代理
- 和动态代理
- 抽象角色
- 接口
- 真实角色
- 被代理的角色
- 代理角色
- 附属操作
- 客户
- 访问代理对象的人
- 操作
- 租房
- 是一个接口
- 真实角色
- 房东
- 实现了接口
- 代理角色
- 房东作为属性
- 有初始化的操作
- 实现操作接口
- 调用真实角色的操作
- 还可以有很多别的操作
- 房东作为属性
- 客户
- 可以使真实角色更纯粹
- 不用关心公共业务
- 公共业务交给代理
- 公共业务发生扩展时方便集中管理
- 降低耦合
- 一个真实角色就会产生一个代理角色
- 开发效率低
- 原来是纵向的开发
- 一条竖线
- 现在是从侧面横切进来一个
- 另外一条竖线
- 通过反射
- 动态加载一个类
- 动态代理的底层都是反射
- 代理类是动态生成的
- 动态代理分为两大类
- 基于类
- cglib
- 基于接口
- JDK的动态代理
- 目前还有java字节码
- 直接用java编码
- javasist
- 基于类
- 需要了解两个类
- Proxy
- InvocationHandler
- 调用处理程序
- 是reflect(反射包)下的接口
- 每个代理都有调用处理程序
- 这个类通过代理实例来生成调用处理程序
- 在代理实例调用方法时
- 方法会被发送到调用处理程序
- 只有invoke方法
- 参数
- proxy:你要代理谁
- method:代理他的什么方法
- 一些参数:一般是个固定的
- 静态方法(打点)可以创建动态代理类
- 如何使用
- 先InvocationHandler接口
- 获取一个代理类
- 方法
- 实现InvocationHandler接口
- 处理代理实例,并返回接口
- 用来处理
- 生成代理类
- Proxy
- 生成代理类
- 定义一个生成代理类的方法
- Proxy.newProxyInstance
- 参数1,获得反射出来对象的类加载器
- 参数2,new一个被代理的接口(操作)
- 第三个参数,实现的InvocationHandler接口
- 在处理类中处理操作
- method.invoke()
- 参数
- 用invoke来执行方法(操作)
- method.invoke()
- 加一些操作
- 在处理类中加一些操作
- 在定义一个客户类,来使用
- 真实角色,出来
- 代理角色,现在没有,想办法生成
- 生成 代理角色的处理类
- 通过处理类来处理代理角色要做事
- 然后在通过处理类里的方法生成代理类
- 总结具体操作
- 没有自己写代理类
- 是通过代理类的处理程序来完成
- 可以处理任何类,属性里的实体类对象类型是Object
- 用setTarget来设置实体类
- 公共方法如何加
- 在处理类里加一个获取方法,的方法
- invoke里调用该方法
- 获得方法
- 一个动态代理代理的是一个接口
- 一般是一类业务
- 一个动态代理类代理可以多个类,只要实现了接口
- 面向切面编程
- 加一个功能
- 不能改变原有的业务
- 规范化的动态代理
- 写一个切面类
- 横切关注点
- 切面
- 通知
- 目标
- 代理
- 切入点
- 连接点
- 五种类型的Advice对比册
- 导入包
- 接口类
- 实现类
- 动态代理类-替换成Spring来使用
- 定义一个Log类
- 实现接口,选择接口根据Advice是前置后置/环绕来决定
- 对应实现的方法
- 参数
- method,对应要执行的目标对象的方法
- object,参数
- target,目标对象
- before的实现方法
- 会在方法执行前自动调用
- AfterReturning
- 执行后,拿到返回值,再执行该方法
- 写入Resource中的xml
- 注册bean
- 三个类
- 实现类
- before
- after
- 配置aop
- 引入头文件,
- 导入aop的约束(命名空间)
- 切入点
- pointcut
- expression=execution()
- 代表插入的位置,哪个点
- 执行环绕
- advisor
- 引用ref了 , 上方的log
- 注册bean
- 测试
- 获取ClassPath
- getBean
- 动态代理代理的是接口
- AOP就是为了将核心代码和非核心代码分离
- 在核心代码切入非核心代码
- 项目中体现在:完成事务和日志的记录
- 自定义类
- 绑定bean,取个别名,输入完整包路径
- < aop:config>标签
- 里面加上 < aop:aspect> 标签
- 是切面
- ref就是引用
- 如何切入
- 切入点:类中的一个方法
- 语法:五个部分
- < aop:before
- < aop:after
- < aop:其他
- 切入点:类中的一个方法
- 允许自定义切面
- Spring的API
- 自定义类,主要是切面定义
- 方式2是在配置文件中配置
- 现在直接在类的上面一行加一个@Aspect
- 在类中的方法上面一行加上@before(“”)
- ""中写切入点
- execution(“”)
- 切入点语法
- 注册bean
- 开启注解支持
- < aop:aspect-autoproxy>
- 可以给定一个参数,作为连接点
- 连接点:与切入点匹配的连接点
- 可以从切入点里拿到一些东西
- 相当于加了一层,可以在一层里在做一些处理
- 环绕前最先执行
- 方法执行前,before
- 方法执行
- 环绕后
- 方法执行后,after
- AOP的三种实现方式
- 导入jar包
- junit
- MyBatis
- mysql
- Spring相关
- aop
- MyBatis - Spring
- 专用于整合
- 使用最新的,取决于mybatis 和 Spring版本
- 写配置文件
- 测试
- 编写实体类
- 编写核心配置文件
- 编写接口
- 编写Mapper
- 测试
- MyBatis的事务很笨重
- 可以用Spring横切
- 引入一个配置文件
- 配置几个对象
- MyBatis的几个对象
- dataSource
- jdbc等的配置文件
- 参数property有
- url
- username等
- sqlSessionFactory
- 参数property有
- dataSourMyBatis-config.xml里的内容
- sqlSession
- class是sqlSessiontemplate
- 没有set方法
- 但是有构造方法
- 使用构造器注入
- 进入实现类
- 现在sqlSession全部换成sqlSessionTemplate
- 把该实现类注入bean
- 只new一次
- 用new出来的,getBean
- 数据源
- sqlSessionFactory
- sqlSessionTemplate
- import一个MyBatis配置的的xml文件
- 是注册在bean里
- 也不需要改了
- 多了一个实现类
- 只能手动写set方法
- 来写select等操作
- 注入该类
- sqlSessionFactory
- sqlSessionTemplate
##替换掉sqlSessionTemplate的部分
- 使用一个类
- 继承一个类
- get方法就可以获得sqlSession
- 要么都成功 要么都失败
- 涉及到数据一致性 、 完整性
- ACID原则
- 原子性:一堆当成一个
- 一致性:要么全成功
- 隔离性:多个业务操作同一个资源,防止数据损坏
- 完整性:事务提交之后,就被持久化了
- 整合MyBatis
- 加入一组业务
- 添加一个用户
- 删除一个用户
- 变成一组事务
- add
- delete,SQL语句故意写错
- 调用方法
- 出错,add竟然也能成功?
- 显然这是不行的
- 手动写try catch
- 如果try里面出错,在catch中回滚
- 横切进去的
- 不影响代码
- 在配置文件中加入
- 在bean中注入事务管理器的类
- 使用横切的方式加入
- 找一个切入点/切面 - 配置切面
- 配置事务的类
- < tx:advice >标签
- namespace的约束
- 标签内:给哪些方法配置事务
- 加入标签
- < tx:method name=“add”>
- < tx:method name=“*”>
- 配置事务的传播特性
- 在方法的标签内加入
- timeout 超时
- 只读
- 不对数据库增删改
- 放在query里
- 回滚等
- 传播
- 传播特性 propagation=“REQUIRED”
- 切入点
- 切入
- < aop:advisor
- 没有改变源代码,直接测



