Spring Aop配置使用示例及实现过程和原理介绍

Spring——AOP原理及流程详解 基于5.3.9 版本的Spring源码,对AOP原理及流程详解,AOP是在Bean生成流程中什么位置介入处理的?各个通知方法又是怎么组装的?AOP真的只是动态代理这么简单吗? 阅读详情

相信只要使用过Spring框架的,大家对于AOP都不陌生,尤其提起它就能立刻随口说出,一般用在日志处理、异常处理、权限验证等方面。今天通过例子了解了Spring Aop的配置使用(注意不是AspectJ的配置使用)及通过源码了解了Spring Aop大致的实现过程和原理。

一、相关概念

  • JointPoint

系统在运行之前,AOP的功能模块需要织入到OOP的功能模块中。要进行这种织入过程,需要知道在系统的哪些功能点上进行织入操作,这些将要在其上进行织入操作的系统功能点就称为JointPoint。如某方法调用的时候或者处理异常的时候,在Spring AOP中,一个连接点总是表示一个方法的执行。常见的几种类型的JoinPoint:

Ø 方法调用:当某个方法被调用的时候所处的程序执行点;

Ø 方法执行:该类型表示的是某个方法内部执行开始时的点,应该与方法调用相区分;

Ø 构造方法调用:程序执行过程中对某个对象调用其构造方法进行初始化时的点;

Ø 构造方法执行:它与构造方法调用关系如同方法调用与方法执行间的关系;

Ø 字段设置:对象的某个属性通过setter方法被设置或直接被设置的执行点;

Ø 字段获取:某个对象相应属性被访问的执行点;

Ø 异常处理执行:某些类型异常抛出后,对应的异常处理逻辑执行点;

Ø 类初始化:类中某些静态类型或静态块的初始化时的执行点。

  • Pointcut

Pointcut代表的是JoinPoint的表述方式,简单容易理解的说就是JoinPoint的集合。在将横切逻辑织入当前系统的过程中,虽然知道需要在哪些功能点上织入AOP的功能模块,但需要一种表达方法。Pointcut和一个切入点表达式关联,并在满足这个切入点的Joinpoint上运行。目前通常使用的Pointcut方式有以下几种:

Ø 直接指定Joinpoint所在的方法名称;

Ø 正则表达式,Spring的AOP支持该种方式;

Ø 使用特定的Pointcut表述语言,Spring 2.0后支持该方式。

  • Advice

Advice是单一横切关注点逻辑的载体,它代表将会织入到JoinPoint的横切逻辑。在切面的某个特定的连接点上执行的逻辑。根据它在Joinpoint位置执行时机的差异或完成功能的不同,可分为以下几种形式:

Ø Before Advice:在Joinpoint指定位置之前执行的Advice类型,可以采用它来做一些系统的初始化工作,如设置系统初始值,获取必要系统资源等。

Ø After Advice:在相应连接点之后执行的Advice类型,它还可以细分为以下三种:

² After Returning Advice:只有当前Joinpoint处执行流程正常完成后,它才会执行;

² After throwing Advice:在当前Joinpoint执行过程中抛出异常的情况下会执行;

² After Advice:该类型的Advice不管JoinPoint处执行流程是正常还是抛出异常都会执行。

Ø Around Advice:对附加其上的Joinpoint进行包裹,可以在joinpoint之前和之后都指定相应的逻辑,甚至中断或忽略joinpoint处原来程序流程的执行。

  •  Aspect

它是对系统中横切关注点逻辑进行模块化封装的AOP概念实体,它可以包含多个Pointcut以及相关的Advice定义。

  •  Weave织入器

经过织入过程后,以Aspect模块化的横切关注点才会集成到oop的现存系统中,而完成织入过程实体称为织入器。Spring中使用一组类来完成最终的织入操作,ProxyFactory类是Spring AOP最通用的织入器。

  • Target 目标对象

符合Pointcut所指定的条件,将在织入过程中被织入横切逻辑的对象,称之为目标对象。

单看上述的概念,可能会觉得有点眼花缭乱,其实通过一个简单的AOP的实例即可以帮助我们很快的了解其内部的机制。其实对于方法拦截有不同的实现方式,常用的即有直接采用Spring提供的各种Advice进行拦截,另一种则是采用MethodInterceptor方式进行拦截。

二、配置使用示例

Spring提供的Advice拦截方式

定义一个逻辑接口IBusinessLogic:

[java]  view plain  copy
  1. package com.wow.asc.aop;  
  2.   
  3. public interface IBusinessLogic {  
  4.   
  5.     public void foo();  
  6.   
  7.     public void bar() throws BusinessLogicException;  
  8.       
  9.     public long time();  
  10. }  
其中有一个BusinessLogicException异常,它用于后面对于ThrowsAdvice进行检验的实例,在此定义为:

[java]  view plain  copy
  1. package com.wow.asc.aop;  
  2.   
  3. public class BusinessLogicException extends Exception {  
  4.   
  5. }  

对于该业务逻辑的实现BusinessLogic,如下所示:
[java]  view plain  copy
  1. package com.wow.asc.aop;  
  2.   
  3. public class BusinessLogic implements IBusinessLogic {  
  4.     @Override  
  5.     public void foo() {  
  6.         System.out.println("Inside BusinessLogic.foo()");  
  7.     }  
  8.     @Override  
  9.     public void bar() throws BusinessLogicException {  
  10.         System.out.println("Inside BusinessLogic.bar()");  
  11.         throw new BusinessLogicException();  
  12.     }  
  13.      /*  
  14.      * 返回该方法执行的时间 
  15.      */  
  16.     @Override  
  17.     public long time() {  
  18.         System.out.println("Inside BusinessLogic.time()");  
  19.         long startTime = System.currentTimeMillis();  
  20.         for(int i = 0; i < 100000000; i++);  
  21.         long endTime = System.currentTimeMillis();  
  22.           
  23.         return (endTime - startTime);  
  24.     }  
  25. }  

在完成上述业务逻辑编码后,接下来将进行更多的横切插入点的设计,如在方法执行前或返回时、抛出异常时进行各种处理。对于Advice的写法如下所示:

[java]  view plain  copy
  1. package com.wow.asc.aop;  
  2.   
  3. import java.lang.reflect.Method;  
  4. import org.springframework.aop.MethodBeforeAdvice;  
  5. /* 
  6. * 表示一个在方法执行前进行拦截的一个Advice 
  7.  */  
  8. public class TracingBeforeAdvice implements MethodBeforeAdvice {  
  9.     @Override  
  10.     public void before(Method method, Object[] args, Object target) throws Throwable {  
  11.         System.out.println("execute before (by " + method.getDeclaringClass().getName() + "." + method.getName() + ")");  
  12.     }  
  13. }  
  14.   
  15. package com.wow.asc.aop;  
  16.   
  17. import java.lang.reflect.Method;  
  18. import org.springframework.aop.AfterReturningAdvice;  
  19. /* 
  20.  * 表示一个在方法返回时进行拦截的Advice 
  21. */  
  22. public class TracingAfterAdvice implements AfterReturningAdvice {  
  23.     @Override  
  24.     public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {  
  25.         System.out.println(method.getDeclaringClass().getName() + "." + method.getName() + "spend time: " + returnValue);  
  26.         System.out.println("execute after (by " + method.getDeclaringClass().getName() + "." + method.getName() + ")");  
  27.     }  
  28. }  
  29.   
  30. package com.wow.asc.aop;  
  31.   
  32. import java.lang.reflect.Method;  
  33. import org.springframework.aop.ThrowsAdvice;  
  34. /* 
  35.  * 表示一个异常抛出时进行拦截的Advice 
  36. */  
  37. public class TracingThrowsAdvice implements ThrowsAdvice {  
  38.       
  39.     public void afterThrowing(Method method, Object[] args, Object target, Throwable subclass) {  
  40.          System.out.println( "Logging that a " + subclass + "Exception was thrown.");  
  41.       }  
  42. }  

在设计完上述的代码及逻辑后,即可以通过applicationContext.xml将上述类进行组合,在装配过程中即可明确哪个类的哪些方法需要被拦截,及拦截前、后会做哪些事情。具体的配置示例:

[java]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"  
  4.     xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  6.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  7.         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
  8.         http://www.springframework.org/schema/context http://localhost:8080/schema/www.springframework.org/schema/context/spring-context-2.5.xsd">  
  9.     <bean id="businessLogic" class="com.wow.asc.aop.BusinessLogic" />  
  10.     <bean id="businessLogicBean" class="org.springframework.aop.framework.ProxyFactoryBean">  
  11.         <property name="proxyInterfaces">  
  12.             <value>com.wow.asc.aop.IBusinessLogic</value>  
  13.         </property>  
  14.         <property name="target">  
  15.             <ref local="businessLogic"/>   
  16.         </property>  
  17.         <property name="interceptorNames">  
  18.             <list>  
  19.                 <value>theTracingBeforeAdvisor</value>  
  20.                     <value>theTracingAfterAdvisor</value>  
  21.                     <value>theTracingThrowsAdvisor</value>  
  22.             </list>  
  23.         </property>  
  24.     </bean>  
  25.       
  26.     <bean id="theTracingBeforeAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
  27.         <property name="advice">  
  28.             <ref local="theTracingBeforeAdvice"/>  
  29.         </property>  
  30.         <property name="pattern">  
  31.             <value>.*</value>  
  32.         </property>  
  33.     </bean>  
  34.     <bean id="theTracingAfterAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
  35.         <property name="advice">  
  36.             <ref local="theTracingAfterAdvice"/>  
  37.         </property>  
  38.         <property name="pattern">  
  39.             <value>.*time.*</value>  
  40.         </property>  
  41.     </bean>  
  42.     <bean id="theTracingThrowsAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">  
  43.         <property name="advice">  
  44.             <ref local="theTracingThrowsAdvice"/>  
  45.         </property>  
  46.         <property name="pattern">  
  47.             <value>.*bar.*</value>  
  48.         </property>  
  49.     </bean>  
  50.     <bean id="theTracingBeforeAdvice" class="com.wow.asc.aop.TracingBeforeAdvice"/>  
  51.     <bean id="theTracingAfterAdvice" class="com.wow.asc.aop.TracingAfterAdvice"/>  
  52.     <bean id="theTracingThrowsAdvice" class="com.wow.asc.aop.TracingThrowsAdvice"/>  
  53. </beans>  

通过上述的配置,我们可以看出我们将IBusinessLogic做为代理接口,同时它的真正的目标类是BusinesssLogic。同时会对所有进入方法之前采用TracingBeforeAdvice进行拦截,进行方法前的预处理;对time方法采用TracingAfterAdvice进行拦截,进行方法返回后的处理;对于bar则采用TracingThrowsAdvice进行拦截,当方法返回BusinessLogicException时进行相应的处理。

         在配置完上述类的依赖关系及需要拦截的方法后,即可以编写客户端程序来调用,查看它的运行机制。客户端调用代码:

[java]  view plain  copy
  1. package com.wow.asc.test;  
  2.   
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import com.wow.asc.aop.BusinessLogicException;  
  6. import com.wow.asc.aop.IBusinessLogic;  
  7.   
  8. public class AOPTest {  
  9.     public static void main(String[] args) {  
  10.         ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");  
  11.         IBusinessLogic ibl = (IBusinessLogic)ac.getBean("businessLogicBean");  
  12.         ibl.foo();  
  13.         try {  
  14.             ibl.bar();  
  15.         } catch (BusinessLogicException e) {  
  16.             System.out.println("Caught BusinessLogicException");  
  17.         }  
  18.         ibl.time();  
  19.     }  
  20. }  

通过运行结果来详细的了解下,看是否真正的如上所述,会在方法前、后及异常抛出时能够拦截并进行相应处理。结果如下:

[java]  view plain  copy
  1. 1、execute before (by com.wow.asc.aop.IBusinessLogic.foo)  
  2. 2、Inside BusinessLogic.foo()  
  3. 3、execute before (by com.wow.asc.aop.IBusinessLogic.bar)  
  4. 4、Inside BusinessLogic.bar()  
  5. 5、Logging that a com.wow.asc.aop.BusinessLogicExceptionException was thrown.  
  6. 6、Caught BusinessLogicException  
  7. 7、execute before (by com.wow.asc.aop.IBusinessLogic.time)  
  8. 8、Inside BusinessLogic.time()  
  9. 9、com.wow.asc.aop.IBusinessLogic.timespend time: 46  
  10. 10、execute after (by com.wow.asc.aop.IBusinessLogic.time)  
其实通过1、3、7行可以非常清晰的了解到,每个方法在执行前都被TracingBeforeAdvice拦截到,并执行了预处理。5、6行表示当调用的是bar方法时,会被TracingThrowsAdvice拦截,当有异常抛出时,会执行相应的处理;8、9、10行则表示当调用的是time方法,返回时会被TracingAfterAdvice拦截,对其返回值进行处理。

MethodInterceptor拦截方式

        采用该种方式进行拦截,需要实现一个继承自MethodInterceptor的类,并将该类注册至spring Context中,具体如下:

[java]  view plain  copy
  1. package com.wow.asc.aop;  
  2.   
  3. import org.aopalliance.intercept.MethodInterceptor;  
  4. import org.aopalliance.intercept.MethodInvocation;  
  5.   
  6. public class MyInterceptor implements MethodInterceptor {  
  7.     @Override  
  8.     public Object invoke(MethodInvocation invocation) {  
  9.         Object result = null;  
  10.         StringBuffer info = new StringBuffer();  
  11.         info.append("intercept the method: ");  
  12.         info.append(invocation.getMethod().getDeclaringClass().  
  13. getName());  
  14.         info.append(".");  
  15.         info.append(invocation.getMethod().getName());  
  16.         System.out.println("start " + info.toString());  
  17.         try {  
  18.            result = invocation.proceed();  
  19.         } catch (Throwable e) {  
  20.             e.printStackTrace();  
  21.         } finally {  
  22.             System.out.println("end " + info.toString());  
  23.         }  
  24.         return result;  
  25.     }  
  26. }  
对于类的装配,其实和上面的非常类似,示例:

[java]  view plain  copy
  1. <bean id="testBean" class="org.springframework.aop.framework.ProxyFactoryBean">  
  2.         <property name="proxyInterfaces">  
  3.             <value>com.wow.asc.aop.IBusinessLogic</value>  
  4.         </property>  
  5.         <property name="target">  
  6.             <ref local="businessLogic"/>   
  7.         </property>  
  8.         <property name="interceptorNames">  
  9.             <list>  
  10.                 <value>myInterceptor</value>  
  11.             </list>  
  12.         </property>  
  13. </bean>  
  14. <bean id="myInterceptor" class="com.wow.asc.aop.MyInterceptor"/>  
再通过客户端进行调用,可得到运行结果,从结果来分析可以看出它在方法执行的前、后均添加了相应的日志。

[java]  view plain  copy
  1. start intercept the method: com.wow.asc.aop.IBusinessLogic.foo  
  2. Inside BusinessLogic.foo()  
  3. end intercept the method: com.wow.asc.aop.IBusinessLogic.foo  
  4. start intercept the method: com.wow.asc.aop.IBusinessLogic.time  
  5. Inside BusinessLogic.time()  
  6. end intercept the method: com.wow.asc.aop.IBusinessLogic.time  
至此,采用两种不同方式实现的AOP就结束了,接下去以第一种配置方式讲一下Spring Aop大概的实现原理和过程。

三、Spring Aop实现过程和原理
通过上面的示例我们可以看到通过ProxyFactoryBean产生了目标对象Target(在示例中为BusinessLogic)的代理对象,我们执行该代理对象的foo方法时,事实上方法体中并没有什么具体的逻辑,而是直接执行与其关联的InvocationHandler的invoke方法,在Spring Aop中就是执行JdkDynamicAopProxy的invoke方法(或者Cglib2AopProxy的intercept方法),在JdkDynamicAopProxy的invoke方法中如果没有拦截器的设定,那么直接调用目标对象的相应方法,反之有拦截器会调用ReflectiveMethodInvocation的proceed方法,在该方法中会遍历所有的拦截器,如果当前方法和拦截器中的PoinCut相匹配(Advisor对象里包含Advice和PoinCut对象,而拦截器对象又是由Advisor对象适配过来的),那么则调用相应拦截器的invoke方法,再在invoke方法中调用相应的Advice的方法,如before,afterReturning等,所有拦截器调用完毕之后,则调用被代理对象的方法。

现在还有两个问题代理对象是怎么创建的?拦截器又是从哪里来的?

第一个问题还是得从ProxyFactoryBean说起,IOC容易或者程序会调用该类的getObject方法,那么ProxyFactoryBean会先调用initializeAdvisorChain方法来从配置文件中读取相关的Advisor,接着调用自己的getSingletonInstance方法,在这个方法中会去调用ProxyCreatorSupport(从名字可以看出这是创建代理对象的辅助类),然后会去调用AopProxyFactory这种代理对象工厂的ctreateAopProxy方法去产生代理对象,比如DefaultAopProxyFactory的ctreateAopProxy方法,在这个方法中会去判断目标对象是不是接口的实现类,如果是的话就创建一个AopProxy的子类JdkDynamicAopProxy实例,否则通过Cglib2AopProxy的createCglibProxy方法创建一个AopProxy的子类Cglib2AopProxy实例,之后就可以通过AopProxy的实现类中的getProxy方法返回代理对象了。

第二个问题,拦截器链是在JdkDynamicAopProxy的invoke方法中去获得的,通过AdvisedSupport对象的getInterceptorsAndDynamicInterceptionAdvice方法去获得的,AdvisedSupport这个辅助类从缓存中去获得拦截器链,如果缓存中没有,那么利用DefaultAdvisorChainFactory的getInterceptorsAndDynamicInterceptionAdvice方法去获得。

这就是自己看了Spring Aop相关源码后的理解,如有不对的地方希望指出。

9.spring aop 原理 环境:spring boot2.6.13 ,此篇是对spring validatation 原理的补充;通过此篇文章,可以学习到spring aop是如何解析成 BeanDefinition ,又是如何生成代理对象。 阅读详情

相关推荐

spring ioc和aop原理流程图(详细)

spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图

Spring项目AOP工作流程

Spring项目AOP工作流程。由于AOP是基于Spring容器管理的bean做的增强,所以整个工作过程需要从Spring加载bean说起。流程1:Spring容器启动;流程2:读取所有切面配置中的切入点;流程3:初始化bean;流程4:获取bean执行方法。目标对象(Target):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的。代理(Proxy):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现。

时代各有不同,青春一脉相承。 1063

ubuntu 20.04系统离线安装nfs

ubuntu环境下,离线安装nfs

m0_62464865的博客 2241

一篇文章详细解读Spring的AOP原理过程(Spring面向切面详解)

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

qq_39746820的博客 8291

Linux下离线安装Google Chrome

目录背景一、下载并安装Google Chrome二、下载并安装依赖包1.libvulkan.so.1()(64bit)2.读入数据总结 背景 项目中服务器被要求不能连接外网,不能直接联网安装,所以需要下载Google Chrome安装包和依赖包,然后离线安装。 linux下步骤都一样,不管ubuntu还是centos只是需要下载对应系统的文件包即可。 本机系统:CentOS 7 一、下载并安装Google Chrome 官方下载地址http://www.google.cn/chrome/browser/d

ancientapesman的博客 1万+

多期DID实战指南:从CSDID原理到分组加权策略

本文深入解析多期DID(CSDID方法)在政策评估中的实战应用,从核心思想到分组加权策略全面讲解。通过电商扶贫等案例,详细演示如何正确处理分批实施政策的数据分析,包括分组拆解、子模块DID操作及加权平均选择,帮助研究者规避常见误区,提升政策评估的准确性。

weixin_26833503的博客 524

Spring AOP 的实现过程

原文:Spring AOP 的实现过程aop 的作用是在书写上将辅助业务逻辑从主业务的逻辑中拆出来,实现主业务和辅助业务的,但在执行主业务逻辑的时候,辅助业逻辑业也会执行。从而保证拆前拆后功能不变。那辅助业务拆出来放在哪里?辅助业务封装在切面中,所以 。什么是切面?切面就是一个类,并且被 注释。辅助业务在切面的哪里?辅助业务封装在切面的方法里,不同的方法封装不同的辅助业务逻辑。切面中的方法是怎么触发的呢?给封装辅助业务逻辑所在的方法标注 其中一个或几个注解。这样当主业务方法执行时,辅助业务的逻辑所在的方法就

进击的豌豆的博客 4035

VOSviewer文献可视化006:修改节点标签文字

由VOSviewer软件生成的可视化图形所显示的文字是小写的,有时候,我们希望其所显示的数据(如国家或作者的首字母等)能够以大写的方式呈现,这时可以进行对节点标签文字的修改操作,使图形显示我们想要的一个效果。

qq_41725964的博客 6150

Spring Aop 执行流程

闲聊 在Spring Bean的生命周期中,处理aop的流程只有第一步处理通知和最后一步创建代理对象。 可以说只要去掉第一步和最后一步,也不会影响SpringBean的生命周期。可见在生命周期中处理aop 和aop的理念是完全符合解耦的思想。 切面的组成 一个简单的切面AspectJ 通常可以由多个切入点Pointcut 和多个通知Advice 组成。 切入点:切入点和切入点表达式相辅相成的存在,通常由切入点表达式决定切入点需要切入的位置 通知:在切面里面,通知通常分为五种。分别是前置通知,环绕

@Bean 2415

通俗易懂的图解二叉搜索树、AVL树和红黑树

搜索是一种很常见的需求,当数据较多时,如何找到目标对象时,即需要搜索查找。 那么如何快速找到目标呢,最朴素的思想就是暴力查找,一个一个对比。 显然,当数据量增大时,我们需要优化查找方法获取更快的查找速度,我们可以通过维护一个有序数组,从而实现二分查找,查找速度从O(n)降为O(longn)。 但是数组并不便于插入和删除,链表便成为了最好的选择。 既然是采用二分查找,那么不如直接按照查找的步骤维护一种数据结构,于是二叉搜索树出现了。 二叉搜索树的性质为: 若左子树不为空,则左子树上所有节点值都小于根结点值;

暗色光的博客 758

手把手教你完成基于cnn的手写数字识别系统MATLAB语言

手写数字识别是经典的 CNN 分类应用之一,常用的数据集就是 MNIST 手写数字数据集,包含 0~9 这 10 个数字的手写图片,每个数字都由 6 万幅训练图像和 1 万幅测试图像构成。为了便于直观分析,这里选择 MATLAB 工具箱提供的 DigitDataset 进行训练识别,读者也可以直接利用 MNIST 数据集或者自己设计的数据集进行实验。其中,数据集文件夹 db 如图 所示。在数据集文件夹 db 里面对每个数字都建立了子文件夹,各自包含 1000 幅 28×28 大小的二维灰度图像。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1368

Spring进阶 - Spring AOP实现原理详解之AOP切面的实现

由IOC Bean加载方法栈中找到parseCustomElement方法,找到parse aop:aspectj-autoproxy的handler(org.springframework.aop.config.AopNamespaceHandler)AopNamespaceHandler注册了的解析类是AspectJAutoProxyBeanDefinitionParser。

珍惜当下 1034

【文献笔记】ICCV 2021 | Point Transformer

作者提到,特别适合点云处理,因为自注意力机制是的核心,本质上就是一个集合算子:它对输入元素具有顺序不变性和数量不变性3D点云是无序的,即使改变点云txt文件中的点顺序也不会有任何影响。自注意力机制天然具有排列不变性,因为它通过对所有"点对"的关系进行建模来处理输入,而不依赖于任何特定的输入顺序点云数据通常覆盖了3D空间中的对象或场景,理解这些数据需要捕捉点与点之间复杂的空间关系。自注意力机制能够有效的捕捉这些关系,因为它为每个"点对"赋予一个。

m0_55908255的博客 965

spring源码剖析AOP实现原理剖析

Spring的AOP实现原理,酝酿了一些日子,写博客之前信心不是很足,所以重新阅读了一边AOP的实现核心代码,而且又从网上找了一些Spring Aop剖析的例子,但是发现挂羊头买狗肉的太多,标题高大上,内容却大部分都是比较浅显的一些介绍,可能也是由于比较少人阅读这部分的核心代码逻辑把,然后写这部分介绍的人估计也是少之又少,不过说实话,Spring Aop的核心原理实现介绍确实不太好写,里面涉及的类...

dxx707099957的博客 478

深度解析机器人关节位置环控制:从理论到实践

本文系统阐述了机器人关节位置环控制的核心原理与实现方法。首先介绍了关节控制的基础框架,阐明位置环在闭环控制中的关键作用。随后深入解析PID控制算法原理,包括比例、积分、微分项的功能与参数整定原则。在软件实现部分,提供了模块化设计思路和Python伪代码示例,强调实时性保障和异常处理机制。文章还包含典型面试问题解答和应用案例,展示如何通过参数优化将定位精度提升20倍。最后指出未来发展趋势将聚焦算法自适应性和系统稳健性。全文兼顾理论深度与实践指导,为开发者提供从基础到进阶的完整技术路线图。

郑伟强dev的专栏 50

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring-AOP概念及使用教程

Spring-AOP 1、AOP 基本概念 ​ (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 ​ (2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能 ​ (3)使用登录例子说明 AOP 2、AOP(底层原理) ​ a)AOP 底层使用动态代理 ,动态代理有两种情况: 第一种 有接口情况,使用 JDK 动态代理 ;创建接口实现类代理对象,增强类的方法 第二种 没有接口情况

学而时习 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring AOP原理与源码分析

@EnableAspectJAutoProxy @EnableAspectJAutoProxy注解用于开启AOP功能,那么这个注解底层到底做了什么呢? 查看@EnableAspectJAutoProxy的源码,发现它使用@Import注解向Spring容器中注入了一个类型为AspectJAutoProxyRegistrar的Bean: class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar { @Overri

morris 6972

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

aspectj原理_Spring Aop标签解析原理详解

作者:爱宝贝丶来源:https://dwz.cn/HIiwPh8S对于Spring Aop的实现,是非常复杂的,其实现过程主要包含xml标签的解析,切面表达式的解析,判断bean是否需要应用切面逻辑,以及使用Jdk代理或者是Cglib代理生成代理类,本文主要讲解Xml标签的解析的实现原理。关于Spring Aop的实现,由于其是使用自定义标签进行驱动的,因而读者朋友如果对S...

weixin_39834984的博客 113

spring源码剖析(六)AOP实现原理剖析

Spring的AOP实现原理,酝酿了一些日子,写博客之前信心不是很足,所以重新阅读了一边AOP的实现核心代码,而且又从网上找了一些Spring Aop剖析的例子,但是发现挂羊头买狗肉的太多,标题高大上,内容却大部分都是比较浅显的一些介绍,可能也是由于比较少人阅读这部分的核心代码逻辑把,然后写这部分介绍的人估计也是少之又少,不过说实话,Spring Aop的核心原理实现介绍确实不太好写,里面涉及的类

bwh0520的博客 1251

xml中 aop:aspect aop:advisor如何配置

我们知道Spring-AOP的核心执行流程是这样的. 1. Spring Ioc初始化所有Bean. 如果初始化Bean的时候发现改Bean满足pointcut中SpEl表达式, 则将该Bean做动态代理. 2. 在Bean的方法执行时,判断该Bean是否为代理对象,若是代理对象的话, 判断当前Method是否满足aop表达式, 3. 如果满足表达式,则按照顺序通知Aop配置的各通知(前,后...

yangsnow_rain_wind的专栏 3112

Spring源码之AOP

Spring源码之AOP 概述 设计原理 ProxyFactoryBean生成AopProxy代理对象 Spring AOP拦截器调用的实现 1 JdkDynamicAopProxy的invoke拦截 2 CglibAopProxy的intercept拦截 3 目标方法的调用 4 AOP拦截器链的调用 5 配置通知器 6 Advice通知的实现 Spring源码之AOPAOP是Aspect-Orie

扯皮屋 747

Spring AOP 源码解析

之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。 本文不会像 IOC 源码分析那篇文章一样,很具体地分析每一行 Spring AOP 的源码,目标读者是已经知道 Spring IOC 源码是怎么回事的读者,因为 Spring AOP 终归是依赖于 IOC 容器来管理的。 阅读建议:1、先

赶路人儿 1830

Spring AOP的原理

/ 目标对象@Override// 前置通知System.out.println("[前置通知] 开始执行方法: " + method.getName());System.out.println("[前置通知] 参数: " + Arrays.toString(args));try {// 执行目标方法// 后置通知(正常返回)System.out.println("[后置通知] 方法执行成功,返回值: " + result);// 异常通知。

weixin_44609018的博客 1409

Spring AOP原理

AOP原理 解析 <aop:aspectj-autoproxy /> 标签 入口 DefaultBeanDefinitionDocumentReader.parseBeanDefinitions() 1.解析自定义名称空间的标签 1.1.由 NamespaceHandlerResolver 根据 namespaceUri 获取具体的 NamespaceHandler 1.1.1.第一次...

flyingzc的博客 600

Spring AOP源码:拦截器责任链处理过程

AOP动态代理过程使用责任链设计模式,将符合条件的MethodInterceptor实现类进行层层调用,但是不一定MethodInterceptor集合中的所有都会被调用,如果某个MethodInterceptor执行过程中,没有调用其下层拦截器,直接返回了,则后面的拦截器不会进行调用。

猪大肠的博客 964
上一篇: JDK的动态代理深入解析(Proxy,InvocationHandler)
下一篇: Spring aop利用jdk的InvocationHandler产生动态代理
鹿晗的晗
博客等级 码龄16年 22粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值