Spring Aop底层源码实现(一)
动态代理基础与实现动态代理的作用在不修改目标类的前提下为目标类的方法添加额外逻辑。两种代理方式JDK动态代理与CGLIB代理JDK动态代理基于接口使用java.lang.reflect.Proxy。CGLIB代理基于继承适用于没有接口的目标类。Spring对代理机制的封装Spring内部使用ProxyFactory统一处理代理逻辑屏蔽JDK与CGLIB的差异。CGLIB代理演示与代理逻辑实现CGLIB代理基本用法使用Enhancer类创建代理。设置目标类、回调逻辑MethodInterceptor。MethodInterceptor接口作用在intercept方法中定义代理逻辑。手动调用MethodProxy.invokeSuper执行目标方法。代理对象与目标对象区别Object参数为代理对象MethodProxy用于调用目标方法。常见错误死循环问题若在intercept中调用method.invoke(obj, args)会引发死循环。正确方式应使用methodProxy.invokeSuper。JDK动态代理示例JDK代理基本用法使用Proxy.newProxyInstance创建代理。实现InvocationHandler接口定义代理逻辑。JDK代理限制必须基于接口被代理类需实现接口。代理对象类型代理对象类型为接口类型不能直接转换为目标类。ProxyFactory统一代理创建机制ProxyFactory的作用封装JDK与CGLIB代理对外提供统一API。可通过配置指定使用哪种代理方式。添加代理逻辑Advice使用addAdvice方法添加如MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。每种Advice对应不同执行时机方法前、方法后、异常后。执行顺序与责任链模式多个Advice按添加顺序构成责任链。每个Advice执行后自动调用下一个节点最终执行目标方法。Advisor与Pointcut更细粒度的代理控制Advisor Pointcut AdvicePointcut定义代理逻辑应用的方法范围如匹配方法名、参数、类等。Advice定义具体代理逻辑。Pointcut匹配逻辑可自定义匹配规则如通过方法名、异常类型等。Spring提供NameMatchMethodPointcut、AspectJExpressionPointcut等实现。Advisor的使用场景用于指定某个Advice只在特定方法上生效而非所有方法。自动代理创建器BeanPostProcessor实现BeanPostProcessor机制在Bean初始化阶段介入创建代理对象并替换原始Bean。BeanNameAutoProxyCreator根据Bean名称匹配自动为匹配的Bean创建代理。DefaultAdvisorAutoProxyCreator自动扫描Spring容器中所有Advisor并为匹配Pointcut的Bean创建代理。基于BeanPostProcessor机制实现无需手动配置代理逻辑。Spring AOP与AspectJ的关系AOP是一种编程思想通过切面Aspect将横切逻辑与业务逻辑分离。Spring AOP与AspectJ区别Spring AOP基于动态代理运行期织入仅支持方法级别的切面。AspectJ编译期织入支持字段、构造器、注解等更细粒度切面。Spring AOP对AspectJ的兼容Spring AOP使用了AspectJ的注解如Before、After但底层实现基于动态代理。使用Spring AOP需引入AspectJ的注解依赖如aspectjweaver。Spring通过解析AspectJ风格的切面生成对应的Advisor和Pointcut。Spring AOP核心组件与注解支持核心组件Aspect切面包含多个Pointcut和Advice。JoinPoint连接点即被拦截的方法。Pointcut定义哪些方法需要增强。Advice定义增强逻辑及执行时机。注解驱动的AOP配置使用Aspect定义切面类。使用Before、After、Around等定义增强逻辑。使用EnableAspectJAutoProxy启用AOP自动代理。Spring AOP源码实现原理EnableAspectJAutoProxy注解作用导入AspectJAutoProxyRegistrar注册AnnotationAwareAspectJAutoProxyCreator。AnnotationAwareAspectJAutoProxyCreator继承AbstractAutoProxyCreator负责扫描Advisor并创建代理。在Bean生命周期中通过postProcessAfterInitialization创建代理对象。切面解析机制解析Aspect注解类提取其中的Before、After等注解。将每个注解解析为对应的Advice和Pointcut封装为Advisor。代理创建过程通过ProxyFactory创建代理对象。使用JdkDynamicAopProxy或CglibAopProxy生成代理。Spring AOP与Lazy加载、Transactional等机制的结合Lazy加载原理使用ProxyFactory生成代理对象延迟初始化真实Bean。Transactional事务管理通过AOP在方法前后添加事务控制逻辑。使用TransactionInterceptor作为Advice结合TransactionAttributeSource匹配事务方法。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2431296.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!