# spring-learning **Repository Path**: liaojuhui/spring-learning ## Basic Information - **Project Name**: spring-learning - **Description**: spring源码解析 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-12-07 - **Last Updated**: 2024-07-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-learning #### 介绍 spring源码解析 #### 软件架构 软件架构说明 #### 安装教程 1. spring ioc a. Spring的后处理器只要有两大类,一个是针对BeanDefinition的容器级别的后处理器 - BeanFactoryPostProcessor; 一个是针对getBean操作获得的对象的后处理器 - BeanPostProcessor 此两个后处理器不同之处主要有三点: 1、触发时机不同,前者BeanFactoryPostProcessor是在容器refresh方法中调用,而后者实际调用时机是在getBean方法获取对象时调用; 2、因触发时机不同导致二者处理的对象不同。BFPP处理的是解析完配置文件后注册在容器中的BeanDefinition,而BPP处理的是通过反射生成; 3. 接口样式不同,BeanFactoryPostProcessor只有一个后处理方法,而BeanPostProcessor有一个前置处理方法一个后置处理方法。 2. Spring aop 在注册bean的时候经过的流程 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#getAdvicesAndAdvisorsForBean 负责找advisor 1. 找advisor的时候会忽略factoryBean并排除当前正在创建中的bean org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator#findCandidateAdvisors 解析advisor org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#buildAdvisors specificInterceptors 2. spring aop 在 **_调用_** 的时候会执行到核心方法:org.springframework.aop.aspectj.annotation.ReflectiveAspectJAdvisorFactory#getAdvisors 这里面包含了调用@After @Before @Around 方法的执行流程 3. 检查bean上的接口,如果合适将应用到beanProxy上 Class[] targetInterfaces = ClassUtils.getAllInterfacesForClass(beanClass, getProxyClassLoader());//(获取当前实现类的实现) for (Class ifc : targetInterfaces) { if (!isConfigurationCallbackInterface(ifc) && !isInternalLanguageInterface(ifc) && ifc.getMethods().length > 0) { hasReasonableProxyInterface = true; break; } } 判断是不是合理的advisce:不是ConfigurationCallbackInterface() 不是InternalLanguageInterface() 就算符合条件的接口 4. 模拟Spring Transaction 注册Apc(AutoProxyCreate) ,spring-ratelimiter项目 例子1: AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry); 注册apc那么需要在@Configuration注解下对bean进行@Role(BeanDefinition.ROLE_INFRASTRUCTURE)标识当前类需要被代理,否则注册的Bean不会被代理 详情请看我的博客:https://blog.csdn.net/qq_40694145/article/details/111482012 例子2: AopConfigUtils.registerAspectJAutoProxyCreatorIfNecessary(registry); 注册APC需要导入spring-aspects jar包,否则报错Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/aspectj/lang/annotation/Pointcut #### 使用说明 1. Spring Transaction 扫描步骤 在AbstractFallbackTransactionAttributeSource中的注释中有说道,会按照下面的顺序去找对应的@Transactionl注解 第一步先找方法是否有Transaction注解 第二步在找当前类是否有Transaction注解 第三步当前接口方法是否有Transaction注解 第四步在找当前接口是否有Transaction注解 2. Spring Aop Spring5.1后增加,原始实例的后缀(.ORIGINAL),例如"com.mypackage.MyClass.ORIGINAL",强制返回给定的实例(没有代理) 3. xxxx #### 参与贡献 1. spring 官方文档地址 [https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#aop]