day07 Spring 事务与集成 MyBatis

  • 理解 AOP 是什么,为什么使用 AOP,Spring 与它是什么关系。

    AOP是一种面向切面(where,when,what)编程思想

    想给某些类的某些方法加功能,不用去修改其代码,只要编写配置即可,底层最终使用动态代理帮我们加功能和方法,以后在写多个方法的时候,出现相同的代码的时候,考虑使用AOP来解决

    spring是AOP思想之一,实际使用的时候需要添加spring-aopaspectjweaver 两个依赖

  • 理解为什么要 Spring 集成 MyBatis,集成本质是什么,利用 Spring 什么功能做什么。

    发挥各个框架的优势,从而提高项目开发和维护效率

    使用mybatis完成数据库的CRUD

    使用spring IOC DI完成各个层对象的创建和注入

    利用AOP给业务方法添加真正的事务功能

  • 掌握完成 Spring 集成 MyBatis。

    看清集成本质

    抓住配置对象之间的关系

    记住一些类的名字和类中的属性

  • 了解 Spring 对事务的支持体验在哪里。

    spring-jdbc spring-tx

    DatasourceTransactionManager

  • 掌握利用 AOP 给业务方法添加事务。

    配置事务管理器,指定数据源(DatasourceTransactionManager)

    那些业务需要事务,贴Transcational注解

    配置事务解析器

jdk动态代理的实现方法

步骤:

​ 创建一个模板类

​ //引入真实业务类型

​ //引入增强的功能

​ 重写其中的方法 invoke(){

​ //在当前方法中进行某个业务类的增强

​ }

通过模板类(实现java的invocationhander接口)生成代理类,然后调用代理类中的方法

动态代理jdk的关系

代理类和真实业务实现类是兄弟关系,实现的都是真是业务类的接口

jdk动态代理必须要求(重要):

​ 模板类实现的是spring中的invocationHander接口

​ 被增强的业务类(真实类)必须要实现接口

​ 最终生成的代理类其实就是接口的实现类,和真实业务类是兄弟关系

CGLIB动态代理关系(重要)

代理类和真实业务类是父子关系

CGLIB可以生成真实类的子类,重写父类非final修饰的方法

真实类不可以是final修饰

为什么使用aop

实现代码开闭原则,在后期更加容易维护,在需要做切面的时候进行使用

面向切面编程:给业务增强功能

专业术语

joinpoint:连接点,在哪里增强

pointcut:切入点.哪些地方增强

advice:增强

aop实现及Aspectj表达式

Aspectj表达式(做切面的地方):

execution(* cn.wolfcode.service.impl.*ServiceImpl.save.*(..))
使用xml配置aop
  
    <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:抛出异常的时候执行切面的方法

变更使用CFLIB
<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"/>

你可能感兴趣的:(mybatis,spring,java)