spring AOP和事务

(1)事务模板

try{
    //1:开启事务
    //2:执行操作
    //3:提交事务
    //4:返回结果
}catch (Exception e){
     //5:回滚操作
}finally {
     //6:释放资源
}

(2)AOP:面向切面编程,作业:在程序运行期不修改源码实现对已有的方法进行增强

优势:减少重复代码,提高开发效率,维护方便

实现方式:使用动态代理技术

通过实现配置的方式实现

选择:是否有接口或实现子类的方式进行aop编程,在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理方式。

(3)Joinpoint:连接点,所谓连接点是指那些被拦截到的点,在spring中,这些点指的是方法,因为spring只支持方法类型的连接点

Pointcut:切入点,所谓切入点是指我们要对那些Joinpoint进行拦截的定义

所有的切入点是连接点,但是不是所有的连接点是切入点

advice:所谓通知是指拦截到Joinpoint之后要做的事情就是通知,通知类型有:前置通知,后置通知,异常通知,最终通知

整个的invoke方法在执行就是环绕通知,在环绕通知中会有明确的切入点调用

Introduction:引介,是一种特殊的通知,在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法或field。

Target:目标对象,代理的目标对象

Weaving:织入,是把增强应用到目标对象来创建新的代理对象的过程,spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入

Proxy:代理,一个类被aop织入增强后,就产生一个结果代理类

Aspect:切面,是切入点和通知(引介)的结合

(4)要做的事情

x:开发阶段,程序员要编写核心业务代码(开发主线);大部分程序员来做,要求熟悉业务需求。

把公用代码抽取出来,制作成通知。(开发阶段最后再做);aop编程人员来做。

在配置文件中,声明切入点与通知间的关系,即切面。aop编程人员来做

xx:运行阶段,spring框架完成的。spring框架监控切入方法的执行,一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代理对象,

根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。

(5)13_spring基于XML的AOP

1、把通知bean交给spring管理
2、使用aop:config标签表名开始aop配置
3、使用aop:aspect标签表名配置切面
   id:是给切面提供一个唯一标识
   ref:是指定通知类的bean的id
4、在aop:aspect标签内部使用对应的标签来配置通知的类型
   前置通知:aop:before
               method:用于指定Logger类中那个方法是前置通知
               pointcut:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强
                    切入点表达式写法:关键字:execution(表达式)
                           表达式:访问修饰符  返回值  包名.包名.包名.....类名.方法名(参数列表)
                    标准表达式写法:public void cn.rzpt.service.impl.AccountServiceImpl.saveAccount()
                    服务修饰符可以省略;返回值可以使用通配符,表示任意返回值;
                    包名可以使用通配符,表示任意包,但是有几级包,就需要写几个 *.;包名可以使用..,表示当前包和子包
                    类名和方法名都可以使用通配符来实现通配;
                    参数列表可以直接写数据类型
                        基本数据类型直接写类型名称
                        引用数据类型写包名.类名的方式
                        可以使用通配符表示任意类型,但是必须有参数;可以使用 .. 表示有无参数均可,有参数表示任意类型
                    全通配写法:* *..*.*(..)
                    实际开发中切入点表达式的通常写法:
                       切到业务层实现类下的所有方法
                       写法:* cn.rzpt.service.impl.*.*(..)
<!--前置通知:在切入点方法执行之前执行-->
<!--后置通知:在切入点方法正常执行之后执行-->
<!--异常通知:在切入点方法执行产生异常之后执行-->
<!--最终通知:无论切入点方法是否正常执行,都会在切入点方法之后执行-->

配置切入点表达式:aop-pointcut

id:用于指定表达式的唯一标识,expression用于指定表达式内容

然后使用pointcut-ref进行引用

此标签写作aop:aspect标签内容,只能当前切面使用;也可以写在aop:aspect外面,可以供所有切面使用,必须在aop:aspect之前,顺序要求。

配置环绕通知:

问题:当配置了环绕通知后,切入点方法没有执行,通知方法执行

分析:动态代理的环绕通知有明确的切入点方法调用

解决方法:spring框架提供了一个接口:ProceedingJoinPoint。该接口有个方法proceed(),此方法相当于明确调用切入点方法。该接口可以作为环绕通知的方法参数,在程序执行时,spring框架为

我们提供该接口的实现类供使用。

spring中的环绕通知是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。

(6)spring基于注解的AOP配置(执行调用顺序有问题,选择技术框架时慎重,但是环绕通知正确)

不使用xml的配置方式,

@Configuration

@ComponentScan(basePackages="cn.rzpt")

@EnableAspectJAutoProxy

@Component("logger")
@Aspect
public class Logger {...    
    @Pointcut("execution(* *..*.*(..))")
    public void pt1(){}

    @Before("pt1()")
    public void beforePrintLog()
    ...
}
<!--配置spring创建容器时要扫描的包-->
<!--把通知交给spring管理-->
<!--service配置-->
<!--在切面类配置-->
<!--配置spring开启注解AOP的支持-->
<context:component-scan base-package="cn.rzpt"></context:component-scan>

<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
@Service("accountService")
public class AccountServiceImpl 

猜你喜欢

转载自blog.csdn.net/sky2line/article/details/109465605