• Spring的AOP --2


    1.aop基于xml以及注解的AOP配置

    什么是AOP

    简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的
    基础上,对我们的已有方法进行增强.

    AOP术语:

      切面 --横向插入的系统功能如日志 事务等.

      连接点 --指的是方法的调用 是对一个对象的操作如方法调用或异常抛出.

      切入点 --需要处理的连接点

      通知(增强处理) --在定义好的切入点处所要执行的程序代码,可以理解为切面类中的方法,是切面的具体实现.

      代理 --将通知应用到目标对象之后,被动态创建对象.

      织入 --将切面代码插入到目标对象上,生成代理对象的过程.

    动态代理

    AOP中的代理就是就是由AOP框架动态生成一个对象,该对象可以作为目标对象使用.

     实现动态代理两种方式:

      1.JDK动态代继承接口InvocationHandler实现invoke()方法.

      2.是CGLIB动态代理.

    基于代理类的AOP实现

    使用 ProxyFactoryBean创建AOP代理是最基本的方式,配置文件中可以指定选用jdk或者CJLIB动态代理

      spring的通知类型(可以在执行方法前后进行增强处理)

      1.前置通知---方法执行之前增强 一般用于权限控制

      2.环绕通知---方法执行前后增强通知 可以用于日志和事务

      3.后置通知 ---方法执行后增强 可用于关闭流,上传文件,删除临时文件

      4.异常通知---方法抛出异常进行增强 用于处理异常记录日志

    AspectJ 建议使用

    --基于xml

    aop:aspect:
    作用: 用于配置切面。
    属性:
    id:给切面提供一个唯一标识。
    ref:引用配置好的通知类 bean 的 id。
    
    <aop:aspect id="txAdvice" ref="txManager">
    <!--配置通知的类型要写在此处-->
    </aop:aspect>
    
    aop:before
    作用: 用于配置前置通知。
    指定增强的方法在切入点方法之前执行
    属性:
    method:用于指定通知类中的增强方法名称
    ponitcut-ref:用于指定切入点的表达式的引用
    poinitcut:用于指定切入点表达式
    执行时间点: 切入点方法执行之前执行 <aop:before method="beginTransaction" pointcut-ref="pt1"/>
    
    切入点:
    <!--( * com.service.impl.*.*(..)) 第一个*代表返回类型,表示所有返回类型,第二个*表示类名,第三个*表示所有方法 ..表示方法中的任意参数-->

    --基于注解

    <!--配置spring开启注解AOP的支持-->
    <aop:aspectj-autoproxy/>
    @Pointcut("execution(* com.service.impl.*.*(..))")

    --spring通知类型

    <!--配置AOP-->
    <aop:config>
    <!--配置切面-->
    <!--配置切入点表达式 下面的配置可以引用它-->
    <aop:pointcut id="pt" expression="execution( * com.service.impl.*.*(..))"/>
    <aop:aspect id="logAdvice" ref="logger">
    <!--前置通知-->
    <!--( * com.service.impl.*.*(..)) 第一个*代表返回类型,表示所有返回类型,第二个*表示类名,第三个*表示所有方法 ..表示方法中的任意参数-->
    <aop:before method="beforePrintLog" pointcut="execution( * com.service.impl.*.*(..))"/><!--1.第一种配置方法-->
    <!--后置通知-->
    <aop:after-returning method="afterPrintLog" pointcut-ref="pt"/><!--2.第二种配置方法引用切入点表达式-->
    <!--异常通知-->
    <aop:after-throwing method="throwPrintLog" pointcut-ref="pt"/>
    <!--最终通知-->
    <aop:after method="FinalPrintLog" pointcut-ref="pt"/>
    
    <!--环绕通知 (当配置了环绕通知后,前置通知不再执行了)-->
    <!-- <aop:around method="xxx" pointcut-ref="pt"></aop:around>-->
    </aop:aspect>
    </aop:config>

    2.jdbcTemlate及Spring事务控制

    jdbcTemlate

    它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。spring 框架为我们提供了很多 的操作模板类。 

    --使用

    //1.获取 Spring 容器 ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
    //2.根据 id 获取 bean 对象 JdbcTemplate jt = (JdbcTemplate) ac.getBean("jdbcTemplate");
    //3.执行操作 jt.execute("insert into account(name,money)values('eee',500)");

    Spring事务控制

    spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置(声名式)的方式实现。

    重点是使用配置的方式实现

    1.编程式事务管理

    ...

    2.声名式事务管理

    1.基于xml

    基于xml
    <!--2.配置事务通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
    <!--5.配置事务的属性-->
    <tx:attributes>
    <!-- <tx:method xxx="xxx" ,xxx="xxx" ....配置事务的属性
    isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。
    propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。
    read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
    timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。
    rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。
    no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。
    -->
    <tx:method name="transfer" propagation="REQUIRED" read-only="false"/>
    </tx:attributes>
    </tx:advice>

    2.注解

    注解:<!--2.开启spring对注解事务的支持-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
    
    @Transactional //在需要的类或方法开启事务 增删改数据发生错误 就会回滚数据防止错误
  • 相关阅读:
    uniapp请求拦截
    stellar视差插件
    fullpage全屏插件应用
    fullpage全屏插件简介
    WdatePicker日期插件
    Ueditor富文本编辑器
    layer弹出层
    验证码绘制
    Ajax跨域访问
    JQuery封装的ajax方法
  • 原文地址:https://www.cnblogs.com/july7/p/13242049.html
Copyright © 2020-2023  润新知