Spring AOP的实现可以分为三大部分
1. 注册AOP功能具体实现类
2. 普通Bean实例化时AOP的切入
3. AOP切入具体流程
2. 普通Bean实例化时AOP的切入
ApplicationContext主流程会保证先完成BeanPostProcessor的注册实例化,这样可以保证普通bean实例化时,所有的 BeanPostProcessor 已经实例化了
public void refresh() throws BeansException, IllegalStateException { ...... // Register bean processors that intercept bean creation. // 完成所有 BeanPostProcessor 实例化 registerBeanPostProcessors(beanFactory); ...... // Instantiate all remaining (non-lazy-init) singletons. // 实例化所有的普通单例bean finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); }
实例化bean的操作,流程会调用createBean(),
AOP实现类,有两套几乎同名的函数,注意区分就明白了
// 这一对是在调用createBean之前使用,Instantiation的意思是实例化 postProcessBeforeInstantiation postProcessAfterInstantiation // 这一对是在createBean中已经创建了bean之后使用,Initialization的意思是初始化 postProcessBeforeInitialization postProcessAfterInitialization
protected Object createBean(){ ...... try { // 真正的bean实例化之前调用,如果BeanPostProcessor创建bean,则跳过后面的doCreateBean, 直接返回 // 这个会调用上面的Instantiation系列,最终返回null,进入 doCreateBean Object bean = resolveBeforeInstantiation(beanName, mbd); if (bean != null) { return bean; } } // 真正的bean实例化后调用 BeanPostProcessor的方法再次改变bean Object beanInstance = doCreateBean(beanName, mbd, args); ...... } protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { ...... // 执行 beanPostProcessor.postProcessorBeforeInstantiation() // 注意此方法的名字BeforeInstantiation bean = applyBeanPostProcessorBeforeInstantiation(mbd.getBeanClass(), beanName); // 只有上一个方法返回的bean不是null,才进行下一步 if(bean !=null){ // 执行 beanPostProcessor.postProcessorAfterInstantiation() bean = applyBeanPostProcessorBeforeInstantiation(bean, beanName); } }
普通bean的aop生效,是使用了Initialization系列方法,跟踪doCreateBean(beanName, mbd, args)
protected <T> T doGetBean( final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { ...... if (mbd.isSingleton()) { sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { try { // 开始创建bean的流程 return createBean(beanName, mbd, args); } } ...... } protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException { ...... Object beanInstance = doCreateBean(beanName, mbdToUse, args); ...... } protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) throws BeanCreationException { ...... try { populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { // bean之前已经实例化了,这里面进行最后的初始化init,aop介入 exposedObject = initializeBean(beanName, exposedObject, mbd); } } ...... } protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) { ...... if (mbd == null || !mbd.isSynthetic()) { // 普通bean执行统一的post处理,aop就是在里面实现的 wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); } return wrappedBean; ...... } public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { // 调用AOP的真正实现方法入口 result = beanProcessor.postProcessAfterInitialization(result, beanName); if (result == null) { return result; } } return result; }
相关推荐
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
**三、项目源码分析** 项目的源码包含了一个简单的Spring AOP示例,可能包括以下几个部分: 1. `Aspect`类:包含了切面逻辑的类,通常有多个通知方法。 2. `Service`类:业务逻辑类,切面将会影响到的方法。 3. `...
《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...
有关于Spring,我们最常用的两个功能就是IOC和AOP,前几篇文章从源码级别介绍了Spring容器如何为我们生成bean及bean之间的依赖关系... 确实,Spring也就是通过这两种方式来实现AOP相关功能,下面就通过源码来简单求证下
### Java Spring AOP源码分析 #### 概述 在探讨Spring AOP源码之前,我们首先需要了解Spring AOP的基本概念以及它的工作原理。面向切面编程(Aspect-Oriented Programming, AOP)是一种编程范式,它通过将横切关注...
在本文中,我们将从实现的角度来认识 SpringAOP 框架,从外部接口、内部实现、组成部分、执行过程四个方面来介绍 Spring AOP 框架的结构分析。 最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是...
总结,Spring AOP源码的探索有助于开发者深入理解面向切面编程的实现机制,提升问题解决能力,从而更好地利用AOP技术优化和维护应用程序。通过实践与学习,我们可以更好地驾驭这个强大的工具,提高代码的可维护性和...
Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...
通过源码分析,我们可以深入了解Spring AOP的工作原理,以及如何通过`IntroductionInterceptor`或`@AspectJ`来实现引入。理解并熟练运用这一特性,将有助于我们在实际开发中更好地进行代码解耦和模块化,提升软件的...
在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...
Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者将横切关注点与业务逻辑分离,实现业务逻辑的模块化。AOP核心组件包括几个关键概念,如切面(Aspect)、通知(Advice)、连接点(Joinpoint...
**Spring AOP介绍** ...学习并掌握Spring AOP及其源码分析对于提升作为IT专业人员的技术水平至关重要,它不仅能够帮助我们编写更加优雅和简洁的代码,还能使我们更好地应对复杂的企业级应用需求。
Java流行框架源码分析:Spring源码、SpringBoot源码、SpringAOP源码、SpringSecurity源码、SpringSecurity OAuth2源码、JDK源码、Netty源码
9. **源码分析** 深入研究Spring AOP的源码,可以帮助我们更好地理解其工作原理,例如,可以查看`org.springframework.aop.framework.ProxyFactoryBean`、`org.springframework.aop.aspectj.autoproxy....
在分析 Spring AOP 的源码之前,我们需要了解 Spring IOC 的初始化过程和 Bean 的生命周期等。AOP 是基于 IOC 的 Bean 加载来实现的,所以理解 Spring AOP 的初始化必须要先理解 Spring IOC 的初始化。 二、AOP ...
本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...
在Spring AOP(面向切面编程)中实现日志分析管理是一种常见的做法,它能帮助开发者跟踪和理解系统运行过程中的行为,同时提供详细的错误日志以支持运维工作。通过元注解的方式,我们可以轻松地将日志记录功能集成到...
老王读 Spring AOP 系列文章的源码分析&测试代码 帮助大家学习 Spring 源码,更加了解 Spring 的底层 博客专栏地址:https://blog.csdn.net/wang489687009/category_11269905.html
标题"spring aop实现日志功能"涉及到的是如何利用Spring AOP来记录和跟踪应用程序中的操作,这对于调试、性能分析和故障排查至关重要。下面我们将详细探讨如何通过Spring AOP来实现日志功能。 首先,理解AOP的基本...
5. **源码分析**: 在`ProxyFactoryBean`的`getObject()`方法中,会调用`createAopProxy()`生成`AopProxy`,然后`AopProxy`的`getProxy()`方法返回实际的代理对象。`createAopProxy()`会根据配置判断使用JDK还是...