首页 > 技术文章 > spring复习(二)AOP

july7 2020-07-05 11:57 原文

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 //在需要的类或方法开启事务 增删改数据发生错误 就会回滚数据防止错误

 

推荐阅读