1.使用注解实现事务(声明式事务),事务是针对数据库的[先导入jar包,再配置,再使用]
目标:通过事务 使以下方法 要么全成功、要么全失败
public void addStudent()
{
//增加班级
//增加学生
//crdu
}
a. jar包
spring-tx-4.3.9.RELEASE
ojdbc.jar
commons-dbcp.jar 连接池使用到数据源
commons-pool.jar 连接池
spring-jdbc-4.3.9.RELEASE.jar
aopalliance.jar
b.配置
jdbc\mybatis\spring
增加事务tx的命名空间
<!-- 增加对事务的支持 -->
<tx:annotation-driven transaction-manager="txManager" />
c.使用
将需要 成为事务的方法 前增加注解:
@Transactional(readOnly=false,propagation=Propagation.REQUIRED)
2.AOP:面向方面编程
一个普通的类 -> 有特定功能的类
a.继承类 b.实现接口 c.注解 d.配置
public class MyFilter exntends/implements Xx
{
}
类 -> “通知” :实现接口
前置通知实现步骤:
a.jar
aopaliance.jar
aspectjweaver.jar
b.配置
c.编写
aop:每当之前add()之前 自动执行一个方法log();
![](/qrcode.jpg)
addStudent(); 业务方法(IStudentService.java中的 addStudent())
before(); 自动执行的通知,即aop前置通知
public class Xxx
{
@Test
a(){}
}
如果出现异常:类似java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
则说明缺少jar
后置通知:
a.通知类 ,普通实现接口
b.业务类、业务方法
StudentServiceImpl中的addStudent()
c.配置:
将业务类、通知 纳入springIOC容器
定义切入点(一端)、定义通知类(另一端),通过pointcut-ref将两端连接起来
异常通知:
根据异常通知接口的定义可以发现,异常通知的实现类 必须编写以下方法:
public void afterThrowing([Method, args, target], ThrowableSubclass):
a.public void afterThrowing(Method, args, target, ThrowableSubclass)
b.public void afterThrowing( ThrowableSubclass)
环绕通知: 在目标方法的前后、异常发生时、最终等各个地方都可以 进行的通知,最强大的一个通知;
可以获取目标方法的 全部控制权(目标方法是否执行、执行之前、执行之后、参数、返回值等)
在使用环绕通知时,目标方法的一切信息 都可以通过invocation参数获取到
环绕通知 底层是通过拦截器实现的。
二、实现注解实现 通知 ,aop
a.jar
与 实现接口 的方式相同
b.配置
将业务类、通知 纳入springIOC容器
开启注解对AOP的支持<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
业务类 addStudent - 通知
c.编写
通知:
@Aspect //声明该类 是一个 通知
public class LogBeforeAnnotation {
}
注意:通过注解形式 将对象增加到 ioc容器时,需要设置 扫描器
<context:component-scan base-package="org.lanqiao.aop"></context:component-scan>
扫描器 会将 指定的包 中的 @Componet @Service @Respository @Controller修饰的类产生的对象 增加到IOC容器中
@Aspect不需要 加入扫描器,只需要开启即可:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
通过注解形式 实现的aop,如果想获取 目标对象的一些参数,则需要使用一个对象:JointPoint
注解形式的返回值:
a.声明返回值 的参数名:
@AfterReturning( pointcut= "execution(public * addStudent(..))" ,returning="returningValue" )
public void myAfter(JoinPoint jp,Object returningValue) {//returningValue是返回值,但需要告诉spring
System.out.println("返回值:"+returningValue );
注解形式实现aop时,通知的方法的参数不能多、少
实现接口形式、注解形式 只捕获声明的特定类型的异常,而其他类型异常不捕获。
cath()
三、通过 配置将 类->通知
基于Schema配置
类似 与 实现接口的方式
接口方式通知:public class LogAfter implements AfterReturningAdvice
Schema方式通知:
a.编写一个普通类 public class LogAfter {}
b.将该类 通过配置,转为一个“通知”
如果要获取目标对象信息:
注解、schema:JoinPoint
接口:Method method, Object[] args, Object target
schema形式 和注解形式相似,不同之处: 注解形式 使用了注册@After, schmema形式进行了多余的配置