Spring-aop

特点  是对oop的补充,解决代码混乱和代码分散的问题,通过动态代理实现AOP

概念  切面  实现AOP功能的类

    通知  切面类中实现切面功能的方法

    连接点  程序执行的特定位置

    切点  连接点的定义

    目标  被通知的对象

    代理  向目标应用通知而产生的对象

用法  要通过接口创建目标的代理

    配置AOP  注解  基于AspectJ

              容器配置  启用扫描器

                    启用AspectJ注解支持  <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

                    定义切面类  @Component  容器管理

                           @Aspect  切面类

                           定义通知  参数JoinPoint  代表连接点的数据

                                         getSignature().getName()  方法名

                                         getArgs()  返回Object[]  参数列表  

                                 通知类型  @Before  前置通知(在方法执行前执行)

                                       @After  后置通知(在方法执行后执行,不论是否发生异常)

                                       @AfterReturuning  返回通知(returning=返回值的参数名)(必须有对应参数)

                                       @AfterThrowing  异常通知 throwing=“接收异常对象的参数”

                                       @Around  环绕通知(可实现其他通知,可控制目标方法的调用)

                                               要求必须有ProceedingJoinPoint类型的参数

                                               必须明确调用ProceedingJoinPoint的proceed()方法

                                             (通过代理调用目标方法,并接受返回值)

                                               必须有返回值(返回执行目标方法的结果)

                                             适当位置添加通知代码

                                               前置  调用proceed()前

                                               后置  在调用proceed()后的finally里

                                               返回  在调用proceed()并接收返回值后

                                               异常  在proceed()返回异常时

                      切点表达式  @通知类型注解(pointcut=“execution(修饰符 返回值类型 包名.类名.方法名(参数类型))”)

                             *可以代表任意修饰符、返回值类型、包名、类名、方法名

                             ..可以代表任意个数的参数类型

                      切点表达式重用  在空的java类上添加@Pointcut(切点表达式)注解

                               在通知的注解里使用“方法名()”代替切点表达式

                               在其他切面类通知的注解里使用“类名.方法名()”代替切点表达式

          XML  把切面类已bean的形式加入容器(注解方式优先级高于XML方式)

              <aop:config>  <aop:aspect ref="切面类bean的id">  定义切面类

                        <aop:before method="方法名" pointcut="切点"></aop:before>   定义通知,前置

                       <aop:after method="方法名" pointcut-ref="公共切点id"></aop:after>   后置通知

                       <aop:after-returning method="方法名" returning="参数名" pointcut-ref="公共切点id"/>  返回通知

                       <aop:after-throwing method="方法名" throwing="参数名" pointcut-ref="公共切点id"/>  异常通知 

                       <aop:around method="方法名" pointcut-ref="公共切点id"/>  环绕通知 

                       <aop:pointcut id="" expression="切点"/>  定义公共切点

原文地址:https://www.cnblogs.com/jingfengling/p/6164957.html