1.代理模式
为什么要使用代理模式?
因为代理模式就是SpringAOP和SpringMVC的底层。
代理模式的分类:
静态代理
动态代理
1.1 静态代理
角色分析:
抽象角色:一般使用接口或者抽象类解决,主要写完成什么事
真实角色:被代理的角色
代理角色:帮助真实角色完成某些事情,从中可以加独有的操作
客户:需要干这件事的用户
就比如我们生活中的租房子,抽象角色就是租房子这件事。真实角色就是房东。代理角色就是中介。而客户就是要租房子的人。
代码步骤:
1. 接口
2. 真实角色
3. 代理角色
4. 客户
加深理解
我们之前使用的userDao接口,如果使用了此实现类,如果在每一个方法上都添加一个日志,就得在每一个方法中添加代码,如果使用代理模式,我们直接将所需的这个类提取出来就可以做到这件事。
使用代理的目的就是为了在不修改原来代码的基础上,横向的增加自己的新功能,但是使用静态代理的缺点就是没产生一个代理,就要创建一个代理对象,这时我们的代码量就会翻倍,为了解决这个问题,我们引入了动态代理。
1.2 动态代理
- 动态代理角色和静态代理角色相同。
抽象角色,真实角色,代理角色,用户 - 动态代理是生成好的,不是我们直接写好的。
- 动态代理分为基于接口动态代理和基于类的动态代理
- 我们在这里使用基于类的动态代理
动态代理类创建步骤:
1. 创建一个抽象角色
2. 创建一个真实对象
3. 创建动态的代理对象(继承InvocationHandler)
创建被代理接口
生成该接口的set方法
生成getProxy方法
生成invoke方法
添加自己的操作
4. 创建用户
2.AOP
什么是AOP?
AOP是面向切面编程,通过预编译的方式和运行期动态代理实现程序功能统一维护的技术,使用AOP可以将业务之间的逻辑分离,从而使业务逻辑各部分之间耦合度降低,提高程序的可重用性,增加开发效率。
AOP在spring中的作用?
提供声明式事务,允许用户自定义切面。
横切关注点:在哪个地方执行
切面:关注点被模块化成为一个对象
通知:执行什么方法,切面中的方法
其中有5中通知:
前置通知:方法前通知(MethodBeaforeAdvice)
后置通知:方法后通知(AfterReturnintAdvice)
环绕通知:方法前后(MethodInterception)
异常抛出通知:方法抛出异常通知(ThrowsAdvice)
引介通知:类中增加新方法或属性(IntroductionInterceptor)
目标:被通知的对象(execution)
2.1 通过API接口使用
步骤:
1. 先创建接口
2. 创建接口实现类
3. 通过接口创建通知
4. 配置(ApplicationContext.xml)
5. 测试
- 配置所需bean
- 使用aop接口
- 配置切点
- 执行通知
2.2 使用自定义切面实现AOP【建议使用】
步骤:
1. 自定义切面
2. 配置ApplicationContext.xml
3. 测试
2.3 使用注解配置
步骤:
1. 创建一个类使用注解标记切面,切点
2. 开启使用注解配置
3. 测试
3.Spring整合Mybatis
导入相关的依赖jar包
3.1 第一种实现方式
首先创建一个applicationContext.xml
在其中用DriverManagerDataSource配置dataSource(就如之前在mybatis中配置的datasource一样)
然后通过SqlSessionFactoryBean创建sqlSessionFactory,用来创建sqlSession,并在其中配置mybatis的配置文件
在通过SqlSessionTemplate配置sqlsession并注入sqlSessionFactory
最后在配置mapp文件
简化之前的mybatis-config.xml的配置文件
之前的Mapper和Mapper.xml文件不变
添加了一个新的实现类
测试
3.2 通过继承SqlSessionDaoSupport实现
继承了SqlSessionDaoSupport就可以直接不用写sqlsession了,spring帮我们生成了。
4.声明式事务
什么是事务?
把一组操作绑定在一块,执行事要么都成功要么都失败。遵循着ACID原则。
如果没有开启事务,就算提交的业务中有错误,没有错误的也会提交上去。
这就是我们数据中的大忌!
我们通过声明式事务开启事务
我们把要提交的一类的业务放在一块进行提交,这时如果一个提交不上,就全部提交不上了。