【搞定spring】视频课2 -AOP

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();

    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形式进行了多余的配置

    


 

猜你喜欢

转载自blog.csdn.net/ZHAOJING1234567/article/details/90183324