spring学习记录_spring的 AOP

spring中的AOP配置

一、配置文件方式配置

  1、把通知Bean也交给spring来管理

  2、使用aopconfig标签表明开始AOP配置

  3、使用aop:aspect标签表明配置切面

      id属性:给切面提供一个唯一标识

      ref属性:指定通知类beanId

  4、在aop:aspect标签的内部使用对应标签来配置通知的类型

   以下示例是让printLog方法在切入点方法执行之前执行,所以为前置通知。

       aopbefore:表示前置通知

       aopbefore里面的method属性:用于指定Logger类中哪个方法是前置通知

       aopbefore里面的pointcut属性:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强  

前置通知:在切入点方法执行之前执行

后置通知:在切入点方法正常执行之后执行

异常通知:在切入点方法执行产生异常之后执行

最终通知:无论切入点方法是否正常执行都会在最后执行

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

注意:环绕通知如无明确的切入点方法调用,则不会执行其它通知方法。

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

 

配置切入点表达式id属性用于指定表达式的唯一标识,expression用于指定表达式内容。

此标签写在aopaspect标签内部只能当前切面使用。写在aopaspect标签外面(必须在</aop:config>标签里面)就变成所有切面可用

例如: <aop:pointcut id="pt1" expression="execution(* com.service.impl.*.*(..))"/>

通过标签属性pointcut-ref调用唯一id完成配置。

切入点表达式写法:

      关键字:execution(表达式)

      表达式:

           访问修饰符   返回值   包名.包名.包名...类名.方法名(参数列表)

      标准的表达式写法:

           public void com.service.impl.AccountServiceImpl.saveAccount()

           访问修饰符(public)可以省略

               void com.service.impl.AccountServiceImpl.saveAccount()

           返回值可以使用通配符*,表示任意返回值

               * com.service.impl.AccountServiceImpl.saveAccount()

            包名可以使用通配符*表示任意包。但是有几个包就写几个*

               * *.*.*.AccountServiceImpl.saveAccount()

            包名可以使用..表示当前包及其子包

                * *..AccountServiceImpl.saveAccount()

            类名和方法名都可以使用*来完成通配

                    * *..*.*()

            参数列表

                    可以直接写数据类型:

                        基本类型直接写名称   int

                        引用类型写包名.类名的方式   java.lang.String

                    可以使用*表示可以有任意类型的参数(必须有参数)

                    可以使用..表示有无参数均可,有参数可以是任意类型

           全通配写法:

                     * *..*.*(..)

        实际开发中切入点表达式的通常写法:

              切到业务层实现类下的所有方法

                    * com.service.impl.*.*(..)

二、注解方式配置:

  1bean.xml文件添加上context支持:xmlns:context="http://www.springframework.org/schema/context"

  2、配置spring创建容器时要扫描的包:<context:component-scan base-package="com"></context:component-scan>

  3、配置spring开启注解AOP的支持:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  4、业务层实现类添加配置:@Service("accountService")

  5、通知类配置:@Component("logger")

  整体通知类配置如下:

  

  

原文地址:https://www.cnblogs.com/huangbf/p/13530526.html