# ssm **Repository Path**: CodeCuiyt/ssm ## Basic Information - **Project Name**: ssm - **Description**: spring 、spring mvc 、mybatis的底层分析. - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-07-28 - **Last Updated**: 2022-01-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 注解版spring ioc、aop、声明式事务、Servlet 3.0 以及spring mvc #### Description - spring ioc、aop 、声明式事务的简要源码知识分析。 - spring 的事件监听机制 - spring cache 与 mybatis plus 结合使用 - Servlet 3.0 - spring mvc 痕迹 ### spring aop 所有原理 - 是否给容器中注册组件? - 注册的组件什么时候工作? - 组件工作时候的用处是什么? > @EnableAspectJAutoProxy(proxyTargetClass = true) 此注解是开启 aop 的关键所在, 有它就有 aop, 其中内部导入一个 AspectJAutoProxyRegistrar 组件 - @Import(AspectJAutoProxyRegistrar.class) - AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar 能够为容器里面注册一些自定义的 bean - AnnotationAwareAspectJAutoProxyCreator 把这个组件注册到了我们的容器中 - AnnotationAwareAspectJAutoProxyCreator 分析类关系 - AspectJAwareAdvisorAutoProxyCreator - AbstractAdvisorAutoProxyCreator - AbstractAutoProxyCreator - implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware 此时关注的重点就到了后置处理器(在bean 初始化完成前后做事情)以及 BeanFactoryAware(自动注入 beanFactory) - AbstractAutoProxyCreator 研究这个类中共的后置处理器、BeanFactoryAware相关逻辑 - setBeanFactory - postProcessBeforeInstantiation 等带有 post有关的信息 - AbstractAdvisorAutoProxyCreator 研究这个类中共的后置处理器、BeanFactoryAware相关逻辑 - 重写 AbstractAutoProxyCreator 中的setBeanFactory - > initBeanFactory - AnnotationAwareAspectJAutoProxyCreator 研究这个类中共的后置处理器、BeanFactoryAware相关逻辑 - initBeanFactory 重写了AbstractAdvisorAutoProxyCreator 中的 initBeanFactory > 执行流程 - 传入配置类, 创建ioc容器 - 注册配置类, 调用refresh () 刷新容器 - 注册bean的后置处理器来拦截 bean的创建 - registerBeanPostProcessors - 先获取ioc中的已经定义好的对象的所有后置处理器(beanPostProcessor), 此时确实会有一些定义了但是没有创建的后置处理器 - 给容器中添加一些别的后置处理器 - 优先注册实现PriorityOrder接口的后置处理器 - 然后注册实现Order接口的后置处理器 - 注册没实现优先级接口的后置处理器 - 注册BeanPosterProcessor 实际上就是创建BeanPosterProcessor 对象,保存在容器中 - 创建 AnnotationAwareAspectJAutoProxyCreator - 创建bean的实例 - populateBean 给 bean的属性赋值 - initializeBean 初始化Bean - invokeAwareMethods()处理 Aware 接口的方法回调 - 会调用 setBeanFactory 方法 - applyBeanPostProcessorsBeforeInitialization 应用后置处理器的postProcessorsBeforeInitialization 方法 - invokeInitMethods 执行自定义的初始化方法 - applyBeanPostProcessorsAfterInitialization 应用后置处理器的postProcessorsAfterInitialization 方法 - BeanPostProcessors(AnnotationAwareAspectJAutoProxyCreator) 创建成功 - 把BeanPostProcessors 注册到 BeanFactory中 - beanFactory.addBeanPostProcessors(postProcessor) ==== 以上是创建和注册 AnnotationAwareAspectJAutoProxyCreator 的过程 **这个后置处理器是 InstantiationAwareBeanPostProcessor 类型的** - finishBeanFactoryInitialization(beanFactory) 完成 beanFactory的初始化工作, 创建剩下的单实例bean - 遍历获得容器中的所有bean. 以及创建对象 getBean(beanName) - getBean - > doGetBean() - 创建bean (创建好的bean 会被放到缓存中) 【BeanPostProcessors 是在bean对象创建完成初始化前后调用的】 【InstantiationAwareBeanPostProcessor 是在创建bean实例之前,尝试使用后置处理器返回对象】 - 从缓存中获取 - 缓存中无 -> 新创建 createBean() AnnotationAwareAspectJAutoProxyCreator 会在任何bean创建之前尝试返回实例 - resolveBeforeInstantiation 希望后置处理器能够在此返回一个代理对象 - bean = applyBeanPostProcessorsBeforeInstantiation if (bean != null) { bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); } - applyBeanPostProcessorsAfterInitialization 拿到所有的 BeanPostProcessor 判断是否为 InstantiationAwareBeanPostProcessor - result = beanProcessor.postProcessAfterInitialization(result, beanName); - 如果能返回就直接使用, 如果不能就继续 doCreateBean() 真正的创建bean - AnnotationAwareAspectJAutoProxyCreator 【InstantiationAwareBeanPostProcessor 是在创建bean实例之前,尝试使用后置处理器返回对象】 - 在每一个bean实例创建之前,尝试使用后置处理器返回对象 调用 postProcessBeforeInstantiation - 判断当前bean 是否在advisedBean 中(需要增强) - 判断是否是基础类型的、或者是否是切面(是否带有注解aspect ) - 是否需要跳过 - 获得候选的增强器(切面里面的方法)List 判断类型 - postProcessAfterInstantiation ### spring mvc 扫描,得到jar包中的这个文件内的内容, 1、META-INF/services/javax.servlet.ServletContainerInitializer - SpringServletContainerInitializer 这个类下面有三个子类, 在onstart 方法中回把子类加载到web应用中 - AbstractAnnotationConfigDispatcherServletInitializer 这个子类就是我们需要实现的,它能够加载根容器以及web 容器。 ### 事务管理 - 1、配置事务管理器 DataSourceTransactionManager - 2、注解开启事务 @EnableTransactionManagement > @EnableTransactionManagement 注解解释 ```java @Import({TransactionManagementConfigurationSelector.class}) ``` 注解的背后导入了 TransactionManagementConfigurationSelector 一个selector,会导入一下的两个组件 - AutoProxyRegistrar 给容器中注册了一个 InfrastructureAdvisorAutoProxyCreator 组件 InfrastructureAdvisorAutoProxyCreator ? 是利用后置处理器包装我们的对象, 返回一个代理对象 (增强器) 代理对象执行目标对象的方法实现增强。 - ProxyTransactionManagementConfiguration > TransactionAttributeSource 保存了事务所需要的注解信息- > new AnnotationTransactionAttributeSource(); - > SpringTransactionAnnotationParser()) > TransactionInterceptor 事务的拦截器,里面保存了事务注解信息以及事务管理器, 其核心的本质是一个MethodInterceptor, 方法拦截器, 在执行目标方法的时候会执行拦截器链: 其中的事务拦截器 - 先获取事务相关的属性 getTransactionAttributeSource - 获取事务管理器 determineTransactionManager - this.beanFactory.getBean(PlatformTransactionManager.class); 如果实现没有添加指定的事务管理器, 从IOC中获取事务管理器 事务的执行 (执行目标方法) - invocation.proceedWithInvocation(); 执行事务方法 - this.completeTransactionAfterThrowing(txInfo, var15); 事务出现了异常 - txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus()); 得到事务管理器进行回滚 - this.commitTransactionAfterReturning(txInfo); 方法正常执行了 - txInfo.getTransactionManager().commit(txInfo.getTransactionStatus()); 得到事务管理器提交事务