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