理解 AOP 是什么,为什么使用 AOP,Spring 与它是什么关系。
AOP是一种面向切面(where,when,what)编程思想
想给某些类的某些方法加功能,不用去修改其代码,只要编写配置即可,底层最终使用动态代理帮我们加功能和方法,以后在写多个方法的时候,出现相同的代码的时候,考虑使用AOP来解决
spring是AOP思想之一,实际使用的时候需要添加spring-aop
和 aspectjweaver
两个依赖
理解为什么要 Spring 集成 MyBatis,集成本质是什么,利用 Spring 什么功能做什么。
发挥各个框架的优势,从而提高项目开发和维护效率
使用mybatis完成数据库的CRUD
使用spring IOC DI完成各个层对象的创建和注入
利用AOP给业务方法添加真正的事务功能
掌握完成 Spring 集成 MyBatis。
看清集成本质
抓住配置对象之间的关系
记住一些类的名字和类中的属性
了解 Spring 对事务的支持体验在哪里。
spring-jdbc spring-tx
DatasourceTransactionManager
掌握利用 AOP 给业务方法添加事务。
配置事务管理器,指定数据源(DatasourceTransactionManager)
那些业务需要事务,贴Transcational注解
配置事务解析器
步骤:
创建一个模板类
//引入真实业务类型
//引入增强的功能
重写其中的方法 invoke(){
//在当前方法中进行某个业务类的增强
}
通过模板类(实现java的invocationhander接口)生成代理类,然后调用代理类中的方法
代理类和真实业务实现类是兄弟关系,实现的都是真是业务类的接口
模板类实现的是spring中的invocationHander接口
被增强的业务类(真实类)必须要实现接口
最终生成的代理类其实就是接口的实现类,和真实业务类是兄弟关系
代理类和真实业务类是父子关系
CGLIB可以生成真实类的子类,重写父类非final修饰的方法
真实类不可以是final修饰
实现代码开闭原则,在后期更加容易维护,在需要做切面的时候进行使用
面向切面编程:给业务增强功能
joinpoint:连接点,在哪里增强
pointcut:切入点.哪些地方增强
advice:增强
Aspectj表达式(做切面的地方):
execution(* cn.wolfcode.service.impl.*ServiceImpl.save.*(..))
<aop:config>
<aop:aspect ref="myTranscationManager">
<aop:pointcut id="txcut" expression="execution(* cn.wolfcode.service.impl.*ServiceImpl.*(..))"/>
<aop:before method="begin" pointcut-ref="txcut"/>
<aop:after-returning method="commit" pointcut-ref="txcut"/>
<aop:after-throwing method="rollback" pointcut-ref="txcut"/>
aop:aspect>
aop:config>
<aop:aspect ref="myTranscationManager">
aspect :定义切面
ref=“使用哪一个对象做切入”
<aop:pointcut id="txcut" expression="execution(* cn.wolfcode.service.impl.*ServiceImpl.*(..))"/>
pointcut :定义切点
id=“切入点的别名” ,
expression=“execution(匹配切入的对象)” -------里面可以是一个或多个方法,无论有参还是无参
<aop:before method="begin" pointcut-ref="txcut"/>
befor:在切入前执行切入面中的方法
method=“”:切入面的方法
pointcut-ref=""切入点的别名
<aop:after-returning method="commit" pointcut-ref="txcut"/>
after-returning:在切入点之后指向切面中的某个方法
<aop:after-throwing method="rollback" pointcut-ref="txcut"/>
after-throwing:抛出异常的时候执行切面的方法
<aop:aspectj-autoproxy proxy-target-class="true"/>
集成Mybatis和业务层,将Mapper对象架构给Spring进行管理
使用IOC和DI完成队形的创建和属性的注入
使用AOP配置事务
难点:
1.xml文件的配置,还未使用mybatis进行配置,使用spring的 applicationContext.xml进行配置
2.持久层没有使用dao层,使用的只有mapper的接口配合mapper.xml文件进行数据的CRUD
3.在spring的配置文件做的事情::标签
添加IOC的解析器
<context:Componet-scan base-package="cn.wolfcode">
读取db.properties文件
<cotext:property-placeholder location="db.properties">
配置datasourse连接池(DruidDateSource)
使用SqlsessionFactoryBean创建sqlsession对象,里面有连接池和读取所有的mapper.xml文件
使用MapperScannerConfiguer批量创建mapper接口实现类对象,
<bean id="" class="...MapperScannerConfigurer" >
<properry name="basePackage" value="mapper文件夹的位置"/>
<property name="sqlSessionFactoryBeanName" value="sqlsessionFactory"/>
bean>
basePackage:扫描mapper接口的路径
sqlSessionFactoryBeanName:指定BeanFactory中sqlsessionfactory的名称
spring中有DataSourceTranceManager事务管理
**1.AOP普通方法:**非事务,权限检查,日志管理(可以使用xml或者注解)
使用的注解:Aspect,Pointcut,Before,AfterRunning,AfterThroing
配置解析器
2.真正的事务配置注解(可以使用xml配置,不推荐)
先有事务对象(内置),使用标签创建DataSourceTranceManager对象
配置事务解析器:
<tx:annotation-driver transcation-manager="transcationManager">
使用注解:@Transactional,贴在方法或者类上(不推荐)都行
强制使用CGLIB动态代理
<tx:annotation-driven proxy-target-class="true" transaction-manager="transactionManager"/>