spring aop知识点儿一二

aop即aspect oriented programming,是spring的核心功能之一,其充分利用了ioc容器的proxy代理以及aop的拦截器功能,以下从三方面进行梳理。


spring框架中默认是关闭aop功能的,在项目中需要开启AOP功能即<aop:aspectj-autoproxy/>

一、aop的基本概念

 1.1:advice(通知)定义在连接点做什么,为切面增强提供织入接口,有BeforeAdvice,AfterAdvice,ThrowsAdvice等,会在调用目标方法前,后,异常的时候,通过jdk反射机制回调

 1.2:PointCut(切点)需要增强的方法的集合,决定advice作用于哪个连接点,通常意味着标识方法,可以通过正则表达式或者方法名进行定义。

 1.2.1:JdkRegexpMethodPointcut

            使用jdk正则表达式对方法名进行匹配

1.2.2:NameMatchMethodPointcut

        方法名进行匹配

1.3:Advisor通知器,定义使用哪个通知在哪个切点使用,将Advice和Pointcur结合,达到即开即用,比如DefaultPointcutAdvisor

二、jdk动态proxy代理对象的生成

 
2.1:代理模式概念

        实现被代理对象的接口并且拥有被代理对象的一个对象,进行方法前后额外的处理如preOperation,postOperation。具体如Object invoke(Object proxy, Method method, Object[] args)这个是java中自带的Proxy对象处理代理的业务,其中,proxy指代理对象实例、Method指当前Proxy被调用的方法、args指调用方法中的参数,一般需要Proxy.newInstance方法生成Proxy对象然后调用即可


2.2:JdkDynamicAopProxy

     
是默认的aop应用中产生aopproxy代理对象的,代理对象是某个接口的实现,在运行期间创建一个接口的实现完成代理东南。相关的拦截器已经配置到代理对象中,通过实现AopProxy, InvocationHandler接口,以及直接构造ReflectiveMethodInvocation的invoke方法完成拦截器链的调用,在proxy对象代理的方法被调用时,调用invoke方法会被触发,完成拦截器链的读取以及缓存,从而实现对目标对象方法调用的功能增强。通过AopUtils.invokeJoinpointUsingReflection的反射机制method.invoke实现目标方法的调用


2.3:Cglib2AopProxy

 
通过构造在CglibMethodInvocation(也继承了ReflectiveMethodInvocation)对象完成拦截器链的调用,回调是在DynamicAdvisedInterceptor对象中的intercept方法中实现,通过methodProxy.invoke实现目标方法的调用,要使用该代理需<aop:aspectj-autoproxy proxy-target-class="true"/>进行强制使用,



三、拦截器的应用

 3.1:以上aopProxy对象中分别介绍了构造不同的回调方法启动对拦截器链的调用以及目标方法的调用,最终通过ReflectiveMethodInvocation.proceed进行调用拦截器中的拦截方法

 3.2:aop拦截器链的应用

    在ReflectiveMethodInvocation.proceed方法中,先依次对拦截器进行matches判断是否适用于横切增强的条件,若符合,则调用其通知器的方法并计数。然后递归调用proceed方法至链尾。

3.3:Advice通知实现


四:框架应用

4.1:增强器的提取BeanFactoryAspectJAdvisorsBuilder

  在buildAspectJAdvisors从beanFactory中获取所有注册的bean,遍历beanName找出声明AspectJ注解的类,进行增强提取放入缓存中中。

4.2:切点信息的获取AspectJExpressionPointcut

     通过getPointcut获取方法上面的注解进而得到表达式如@Pointcut(“execution(* *.*test*(..))”),然后使用AspectJAnnotation进行封装

4.3:切点信息增强InstantiationModelAwarePointcutAdvisorImpl

根据不同的注解类型进行不同增强器的调用如MethodBeforeAdviceInterceptor方法调用前处理,AspectJAfterAdvice方法finally中调用

4.4:创建代理

       在源码中通过判断isOptimize(是否使用激进的优化策略)、isProxyTargetClass(代理对象本身)、hasNoUserSuppliedProxyInterfaces(无代理接口)进而选择哪种代理

五:静态代理

<context:load-tme-weaver/>  载入字节码文件的时候完成对目标对象的增强,而动态代理在调用的时候需要动态创建代理以及代理对象,相比较而言,前者效率高

Spring AOP(Aspect Oriented Programming)是 Spring 框架中的一个重要组成部分,用于实现面向切面编程。以下是 Spring AOP 知识体系的主要内容: 1. AOP 的概念:介绍 AOP 的基本概念、作用和优势。 2. AOP 的实现方式:主要有基于代理的 AOP 和基于字节码操作的 AOP 两种实现方式。 3. 切面(Aspect)的概念:切面是 AOP 中的一个重要概念,用于描述一组横切关注点(cross-cutting concern)。 4. 切入点(Pointcut)的概念:切入点是 AOP 中一个非常重要的概念,用于描述在哪些连接点(Join point)上执行切面。 5. 通知(Advice)的概念:通知是切面中的具体行为,用于描述在连接点上执行的具体操作。 6. 引入(Introduction)的概念:引入是 AOP 中一个非常重要的概念,用于在不修改现有类代码的情况下为一个对象增加新的属性或方法。 7. 织入(Weaving)的概念:织入是 AOP 中一个非常重要的概念,用于将切面应用到目标对象上,生成代理对象。 8. AOP 的实践应用:介绍 AOP 在实际开发中的应用场景,如日志记录、性能监控、事务管理等。 9. Spring AOP 的具体实现:介绍 Spring AOP 的具体实现方式,如基于代理的 AOP 和基于注解的 AOP 等。 10. AOP 的局限性和注意事项:介绍 AOP 在实践中可能存在的问题和需要注意的事项,如对 final 方法的限制、对静态方法的限制等。 以上是 Spring AOP 知识体系的主要内容,熟悉这些内容可以帮助开发人员更好地理解和应用 AOP 技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值