spring-aop笔记整理

    科技2024-12-26  4

    spring-aop笔记整理

    ##spring-aop笔记整理 1, 动态代理(由于aop底层是java的动态代理,先简单介绍动态代理)           特点:字节码随用随创建,随用随加载               作用:不修改源码基础上对方法增强                分类:                      基于接口的动态代理                      基于子类的动态代理         1,基于子类的动态代理                涉及的类:Enhancer                提供者:第三方cglib库            如何创建代理对象:                使用Enhancer类中的create方法            创建代理对象的要求:                被代理 类不能是最终类            create方法的参数:                class:字节码(如:producers.getClass())                   他是用于加载代理对象字节码                Callback,用于提供增强的代码                    他是让我们写如何代理,我们一般都是些一个接口的实现类,通常情况下都是匿名内部类,但不是必须的                    此接口的实现类都是谁用谁写                    我们一般写的是该接口的子接口的实现类,MethodInterceptor         2,基于接口的动态代理                 涉及的类:Proxy                 提供者:jdk官方             如何创建代理对象:                 使用Proxy类中的newProxyInstance方法             创建代理对象的要求:                 被代理 类最少实现一个接口,如果没有,则不能使用              newProxyInstance方法的参数:                  ClassLoader:类加载器(如:producers.getClass().getClassLoader(),)                    他是用于加载代理对象字节码的,和被代理对象使用相同的类加载器,固定写法                 Class[],字节码数组(如:producers.getClass().getInterfaces(),)                     他是用于让代理对象和被代理对象有相同的方法,固定写法                 InvocationHandler,用于提供增强的代码                     他是让我们写如何代理,我们一般都是些一个接口的实现类,通常情况下都是匿名内部类,但不是必须的                     此接口的实现类都是谁用谁写 2,spring-aop         1,概述:                    aop即面向切面编程,通俗讲就是 把我们程序重复代码抽取出来,在需要执行的时候,运用动态代理技术,在不修改源码的情况下,对已有方法进行增强                 优势:减少重复代码,提高开发效率,维护方便            2,xml的配置使用                   spring中基于IOC的配置步骤                      1,把通知bean也交给spring来管理                        2,使用aop:config标签开始aop的配置                        3,使用aop:aspect标签表明配置切面                              id属性:给切面提供唯一表识                              ref属性:时指定通知类的bean的id(通知是该类中的方法)                        4,在aop:aspect标签内部使用对应标签来配置通知类型                  (注:让printLog方法在切入点方法执行之前,所以是前置通知)                           aop:before:表示配置前置通知(如前置通知的配置:<aop:before method=“printLog” pointcut="execution( * …. (…))"></aop:before>)                          method属性,用于指定Logger类中那个方法是前置通知( 注此处的前置通知只是示例,通知一共有前置通知、后置通知、异常通知、最终通知以及环绕通知)                          pointcut属性:用于指定切入点表达式,该表达式的含义指的是对业务层中哪些方法增强(注: 此标签写在aop:aspect内部只能当前切面使用,它还可以写在aop:aspect外面,此时就变成了所有切面可用, 当切面通知需要使用时,只需配置 pointcut-ref属性)                              切入点表达式的写法:                                关键字:execution(表达式)                                表达式:                                   访问修饰符   返回值 报名.包名.报名…类名.方法名(参数列表)                                     标准的表达式写法:                                         public void com.itheima.service.impl.AccountServiceImpl.saveAccount()                                     访问修饰符可以省略                                         void com.itheima.service.impl.AccountServiceImpl.saveAccount()                                     返回值可以使用通配符,并表示任意返回                                         com.itheima.service.impl.AccountServiceImpl.saveAccount()                                     报名也可以使用通配符,但是有几级包就写几个*.                                        * .. ..AccountServiceImpl.saveAccount()                                     包名可以使用…表示当前包及其子包                                         * …AccountServiceImpl.saveAccount()                                     类名和方法名都可以使用来实现通配                                         * …. ()                                     参数列表:                                         可以直接写的数据类型:                                             基本类型直接写名称          int                                             引用类型写包名.类名的方式   java.lang.String                                        可以使用通配符来表示任意类型,但是必须有参数                                       可以使用…来表示有无参数均可,有参数可以是任意类型                                     全通配的方式:                                          …. (…)                                     实际开发中切入点表达式的通常写法:                                    切到业务层实现类下的所有方法                                         com.itheima.service.impl. .(…) 注:环绕通知的使用和动态代理类似,也是spring提供一种可以在代码中手动控制增强方法何时执行的方式                 3,注解的配置使用( 注:使用aop注解时,需要在配置文件中添加context:component-scan 以及aop:aspectj-autoproxy,第二个用来开启aop注解支持 )                         1, @Pointcut(“execution(* com.itheima.service.impl. .(…))”)--------》该注解常配置在一个方法体为空的方法上,方法名为该切入点的id(如: @Pointcut(“execution(* com.itheima.service.impl..(…))”) private void ptl(){} )                         2,@Before---------》前置通知,其属性需配置切入点的id                         3, @AfterReturning---------》后置通知,其属性需配置切入点的id                         4,@AfterThrowing---------》异常通知,其属性需配置切入点的id                         5,@After---------》最终通知,其属性需配置切入点的id                         6, @Around---------》环绕通知,其属性需配置切入点的id               以上注解的使用和xml配置上通知的使用类似

    Processed: 0.020, SQL: 8