`

Spring AOP实现源码分析(二)

阅读更多

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流程源码分析-SpringAOP中定义的类图AOP流程源码分析...

    Spring AOP实现 项目源码 Myeclipse 直接导入可用

    **三、项目源码分析** 项目的源码包含了一个简单的Spring AOP示例,可能包括以下几个部分: 1. `Aspect`类:包含了切面逻辑的类,通常有多个通知方法。 2. `Service`类:业务逻辑类,切面将会影响到的方法。 3. `...

    五、Spring源码分析——Spring Aop

    《Spring AOP 源码分析》 在深入探讨Spring AOP之前,我们先要理解AOP(面向切面编程)的基本概念。AOP是一种编程范式,它将关注点分离,使得我们可以将横切关注点(如日志、事务管理、安全检查等)与业务逻辑解耦...

    Spring AOP源码分析.mmap

    有关于Spring,我们最常用的两个功能就是IOC和AOP,前几篇文章从源码级别介绍了Spring容器如何为我们生成bean及bean之间的依赖关系... 确实,Spring也就是通过这两种方式来实现AOP相关功能,下面就通过源码来简单求证下

    Java spring AOP源码

    ### Java Spring AOP源码分析 #### 概述 在探讨Spring AOP源码之前,我们首先需要了解Spring AOP的基本概念以及它的工作原理。面向切面编程(Aspect-Oriented Programming, AOP)是一种编程范式,它通过将横切关注...

    Spring AOP框架实现的结构分析

    在本文中,我们将从实现的角度来认识 SpringAOP 框架,从外部接口、内部实现、组成部分、执行过程四个方面来介绍 Spring AOP 框架的结构分析。 最后,本文的目标是从实现的角度来认识 SpringAOP 框架,观察的角度是...

    spring-aop源码

    总结,Spring AOP源码的探索有助于开发者深入理解面向切面编程的实现机制,提升问题解决能力,从而更好地利用AOP技术优化和维护应用程序。通过实践与学习,我们可以更好地驾驭这个强大的工具,提高代码的可维护性和...

    spring源码--AOP流程--笔记.docx

    Spring AOP 源码分析笔记 Spring AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者 modularize cross-cutting concerns,即将横切关注点模块化。AOP 使得开发者可以将一些公共的功能模块化,以便在...

    Spring Aop 引用新功能 源码

    通过源码分析,我们可以深入了解Spring AOP的工作原理,以及如何通过`IntroductionInterceptor`或`@AspectJ`来实现引入。理解并熟练运用这一特性,将有助于我们在实际开发中更好地进行代码解耦和模块化,提升软件的...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态代理。 JDK 动态代理是基于接口的,它要求被代理的目标对象必须实现至少一个接口。Spring 使用 `java.lang.reflect.Proxy`...

    springAOP核心组件分析.pdf

    Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者将横切关注点与业务逻辑分离,实现业务逻辑的模块化。AOP核心组件包括几个关键概念,如切面(Aspect)、通知(Advice)、连接点(Joinpoint...

    Spring AOP介绍及源码分析

    **Spring AOP介绍** ...学习并掌握Spring AOP及其源码分析对于提升作为IT专业人员的技术水平至关重要,它不仅能够帮助我们编写更加优雅和简洁的代码,还能使我们更好地应对复杂的企业级应用需求。

    Java流行框架源码分析:Spring源码、SpringBoot源码、SpringAOP源码、SpringSecurity源码、

    Java流行框架源码分析:Spring源码、SpringBoot源码、SpringAOP源码、SpringSecurity源码、SpringSecurity OAuth2源码、JDK源码、Netty源码

    Spring AOP的底层实现技术

    9. **源码分析** 深入研究Spring AOP的源码,可以帮助我们更好地理解其工作原理,例如,可以查看`org.springframework.aop.framework.ProxyFactoryBean`、`org.springframework.aop.aspectj.autoproxy....

    Spring框架系列(9) - Spring AOP实现原理详解之AOP切面的实现.doc

    在分析 Spring AOP 的源码之前,我们需要了解 Spring IOC 的初始化过程和 Bean 的生命周期等。AOP 是基于 IOC 的 Bean 加载来实现的,所以理解 Spring AOP 的初始化必须要先理解 Spring IOC 的初始化。 二、AOP ...

    Spring aop 性能监控器

    本篇文章将深入探讨如何使用Spring AOP实现性能监控器,并通过源码分析来理解其工作原理。 首先,我们要了解AOP的核心概念——切面(Aspect)、通知(Advice)、连接点(Join Point)、切入点(Pointcut)和织入...

    spring aop实现日志分析管理

    在Spring AOP(面向切面编程)中实现日志分析管理是一种常见的做法,它能帮助开发者跟踪和理解系统运行过程中的行为,同时提供详细的错误日志以支持运维工作。通过元注解的方式,我们可以轻松地将日志记录功能集成到...

    老王读spring-aop源码分析&amp;测试代码.zip

    老王读 Spring AOP 系列文章的源码分析&测试代码 帮助大家学习 Spring 源码,更加了解 Spring 的底层 博客专栏地址:https://blog.csdn.net/wang489687009/category_11269905.html

    spring aop实现日志功能

    标题"spring aop实现日志功能"涉及到的是如何利用Spring AOP来记录和跟踪应用程序中的操作,这对于调试、性能分析和故障排查至关重要。下面我们将详细探讨如何通过Spring AOP来实现日志功能。 首先,理解AOP的基本...

    spring-aop-ProxyFactoryBean 源码分析

    5. **源码分析**: 在`ProxyFactoryBean`的`getObject()`方法中,会调用`createAopProxy()`生成`AopProxy`,然后`AopProxy`的`getProxy()`方法返回实际的代理对象。`createAopProxy()`会根据配置判断使用JDK还是...

Global site tag (gtag.js) - Google Analytics