Spring源码分析

1. IOC容器的创建

  1. /*
  2. 我们需要清楚:
  3. 1. IOC是一个容器
  4. 2. 容器启动的时候会创建所有的单实例bean
  5. 3. 我们可以直接从容器中获取到某个bean
  6. 我们需要了解:
  7. 1. IOC容器的创建过程
  8. 2. 容器启动期间做了些什么、什么时候创建的所有单实例bean
  9. 3. IOC是如何创建这些单实例bean,并且进行管理的,最后将这些bean保存在什么地方
  10. 源码: 从HelloWorld开始,进行debug调试,边调试边查看控制台的打印
  11. =============================BeanFactory的创建以及准备工作==============================
  12. Spring容器的refresh()--->刷新容器
  13. 1. prepareRefresh()--->刷新前的预处理
  14. initPropertySources()-->初始化一些属性设置(空方法,留给子类实现的)
  15. getEnvironment().validateRequiredProperties();-->校验属性的合法性
  16. this.earlyApplicationEvents = new LinkedHashSet<>();-->保存容器中一些早期的事件
  17. 2. obtainFreshBeanFactory();--->获取BeanFactory
  18. refreshBeanFactory();-->刷新(创建)BeanFactory
  19. getBeanFactory();-->获取BeanFactory
  20. 将BeanFactory返回
  21. 3. prepareBeanFactory(beanFactory);--->BeanFactory的预准备工作(对BeanFactory进行一些 设置)
  22. 设置BeanFactory的类加载器、支持表达式解析器等...
  23. 添加部分BeanPostProcessor后置处理器(ApplicationContextAwareProcessor)
  24. 设置一些忽略的自动装配的接口
  25. 注册可以解析的自动装配,使得我们可以直接在任何组件中进行自动注入
  26. 添加了BeanPostProcessor后置处理器(ApplicationListenerDetector)
  27. 给Bean中注册一些其他有用的组件(比如: 与环境有关的组件)
  28. 4. postProcessBeanFactory(beanFactory);--->BeanFactory准备工作完成之后进行的一些后置处 理工作(空方法,留给子类使用)
  29. ===================================================================================
  30. 5. invokeBeanFactoryPostProcessors(beanFactory);--->执行BeanFactory后置处理器,在
  31. BeanFactory标准初始化之后执行
  32. 先获取所有的BeanFactoryPostProcessor进行遍历
  33. 经过判断之后拿到所有的BeanDefinitionRegistryPostProcessor
  34. 跟据类型获取所有bean的名字,再按照优先级进排序
  35. 然后判断是否实现了Ordered顺序接口,再排序
  36. 最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessor
  37. 6. registerBeanPostProcessors(beanFactory);--->注册bean的后置处理器(作用: 拦截bean的创 建过程)
  38. 获取所有的BeanPostProcessor
  39. 后置处理器默认也是可以通过实现接口PriorityOrdered、Ordered来指定优先级
  40. 先注册实现了PriorityOrdered优先级接口的BeanPostProcessor,然后添加到BeanFactory中
  41. 再注册实现了Ordered顺序接口的BeanPostProcessor
  42. 最后注册没有实现任何优先级接口的BeanPostProcessor
  43. 7. initMessageSource();--->初始化信息源,支持SpringMVC中的国际化功能(消息绑定、消息解析)
  44. 获取BeanFactory
  45. 然后查看容器中是否有id为messageSource的组件,如果有,直接赋值给messageSource属性,如果 没有,则自己创建一个DelegatingMessageSource
  46. MessageSource: 可以取出国际化配置文件中某个key的值,能按照区域信息进行获取
  47. 最后把创建好的messageSource注册到容器中,以后获取国际化配置文件的值的时候,可以自动注入 messageSource
  48. 8. initApplicationEventMulticaster--->初始化一些事件转化器(spring创建和销毁bean的时候会 产生一些其他的事件,需要借助这些事件转化器处理)
  49. 获取BeanFactory
  50. 然后从BeanFactory中获取applicationEventMulticaster
  51. 如果没有获取到,就会默认创建一个SimpleApplicationEventMulticaster,将创建的 applicationEventMulticaster添加到BeanFactory中,以后使用的时候可以自动注入
  52. 9. onRefresh();--->初始化一些其他的组件,这是个空方法,留给子类实现的
  53. 子类可以重写该方法,在容器刷新的时候自定义一些其他组件
  54. 10. registerListeners();--->注册监听器
  55. 从容器中拿到所有的ApplicationListener组件
  56. 然后将每个监听器添加到事件转发器中
  57. 最后将一些早期的事件也添加到事件转发器中
  58. 11. finishBeanFactoryInitialization(beanFactory);--->完成BeanFactory的初始化,这个方 法里面才是对bean的初始化,重点研究
  59. beanFactory.preInstantiateSingletons();-->初始化剩下的所有单实例bean
  60. 先获取容器中的所有bean,依次进行初始化和创建对象
  61. 获取bean的定义信息-->RootBeanDefinition
  62. 判断bean是否为抽象、单实例、懒加载的
  63. 判断是否为FactoryBean,也就是工厂bean(是否实现了FactoryBean接口)
  64. getBean(beanName)-->才是真正的获取bean
  65. getBean方法内部调用doGetBean()方法-->重点方法
  66. 先获取缓存中保存的单实例bean,如果能获取到说明这个bean之前已经创建过,则直接返回
  67. 若缓存中没有,则开始bean的创建对象流程
  68. 先标记当前bean已经被创建,然后获取bean的定义信息
  69. 获取当前bean依赖的其他bean的信息,如果有,则先把当前bean所依赖的bean创建出来
  70. 启动单实例bean的创建流程: createBean(beanName, mbd, args);
  71. createBean底层又会调用doCreateBean()方法来创建bean实例
  72. doCreateBean()方法底层调用createBeanInstance()方法创建bean实例
  73. 12. finishRefresh();--->完成BeanFactory的初始化创建工作,IOC容器创建完成
  74. ====================================================================================
  75. 总结:
  76. 1. Spring容器启动的时候,会先保存所有注册进来的bean的定义信息
  77. xml配置文件注册bean--> <bean></bean>
  78. 注解方式注册bean--> @Bean、@Service、@Controller...
  79. 2. Spring容器会在合适的时机创建这些bean
  80. 用到这个bean的时候,调用getBean()方法创建bean,再保存到容器中
  81. 统一创建剩下所有bean的时候,调用finishBeanFactoryInitialization(beanFactory)
  82. 3. 后置处理器: 每一个bean创建完成之后,都会使用各种各样的后置处理器进行处理,增强bean的功能
  83. AutowiredAnnotationBeanPostProcessor: 处理自动注入
  84. AnnotationAwareAspectJAutoProxyCreator: 开发aop的功能,帮助我们创建代理对象
  85. 4. 事件驱动模型: ApplicationListener进行事件监听
  86. */
  87. //源码
  88. public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
  89. this();
  90. register(annotatedClasses);
  91. refresh(); //所有单实例bean创建完成
  92. }
  93. //刷新容器
  94. @Override
  95. public void refresh() throws BeansException, IllegalStateException {
  96. //保证多线程情况下,IOC容器只会被创建一次
  97. synchronized (this.startupShutdownMonitor) {
  98. //预处理--->准备刷新容器
  99. prepareRefresh();
  100. //ConfigurableListableBeanFactory是BeanFactory的子类
  101. //这里准备了一个创建所有bean的工厂
  102. //这一步,spring会解析xml配置文件将要创建的所有bean,并加入到beanDefinitionMap中
  103. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
  104. //此时所有的bean已经加入到beanFactory中,准备beanFactory(预准备)
  105. prepareBeanFactory(beanFactory);
  106. try {
  107. //BeanFactory准备工作完成之后进行的一些后置处理工作(空方法,留给子类使用)
  108. postProcessBeanFactory(beanFactory);
  109. //执行BeanFactory后置处理器,在BeanFactory标准初始化之后执行
  110. invokeBeanFactoryPostProcessors(beanFactory);
  111. //注册bean的后置处理器
  112. registerBeanPostProcessors(beanFactory);
  113. //初始化信息源,用来支持SpringMVC中的国际化功能(消息绑定、消息解析)
  114. initMessageSource();
  115. //初始化一些事件转化器(spring创建和销毁bean的时候会产生一些其他的事件,需要借助这些事件 转化器处理)
  116. initApplicationEventMulticaster();
  117. //初始化一些其他的组件,这是个空方法,留给子类实现的
  118. onRefresh();
  119. //注册监听器
  120. registerListeners();
  121. //完成BeanFactory的初始化,这个方法里面才是对bean的初始化,重点研究
  122. finishBeanFactoryInitialization(beanFactory);
  123. //此时已经完成了容器的刷新
  124. finishRefresh();
  125. }
  126. catch (BeansException ex) {
  127. if (logger.isWarnEnabled()) {
  128. logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex);
  129. }
  130. destroyBeans();
  131. cancelRefresh(ex);
  132. throw ex;
  133. }
  134. finally {
  135. resetCommonCaches();
  136. }
  137. }
  138. }
  139. //预处理
  140. protected void prepareRefresh() {
  141. this.startupDate = System.currentTimeMillis();
  142. this.closed.set(false);
  143. this.active.set(true);
  144. if (logger.isInfoEnabled()) {
  145. logger.info("Refreshing " + this);
  146. }
  147. //空方法,留给子类实现
  148. initPropertySources();
  149. //校验属性的合法性
  150. getEnvironment().validateRequiredProperties();
  151. //保存容器中一些早期的时间
  152. this.earlyApplicationEvents = new LinkedHashSet<>();
  153. }
  154. //获取BeanFactory
  155. protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
  156. //先刷新BeanFactory
  157. refreshBeanFactory();
  158. //获取BeanFactory
  159. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  160. if (logger.isDebugEnabled()) {
  161. logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
  162. }
  163. return beanFactory; //返回BeanFactory
  164. }
  165. //BeanFactory的预准备工作
  166. protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
  167. //设置类加载器
  168. beanFactory.setBeanClassLoader(getClassLoader());
  169. //设置表达式解析器
  170. beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
  171. beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
  172. //添加ApplicationContextAwareProcessor
  173. beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
  174. //设置一些忽略的自动装配的接口
  175. beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
  176. beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
  177. beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
  178. beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
  179. beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
  180. beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
  181. //注册可以解析的自动装配,使得我们可以直接在任何组件中进行自动注入
  182. beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
  183. beanFactory.registerResolvableDependency(ResourceLoader.class, this);
  184. beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
  185. beanFactory.registerResolvableDependency(ApplicationContext.class, this);
  186. //添加了BeanPostProcessor后置处理器
  187. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
  188. //给Bean中注册一些其他有用的组件(比如: 与环境有关的组件)
  189. if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
  190. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
  191. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
  192. }
  193. if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
  194. beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
  195. }
  196. if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
  197. beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
  198. }
  199. if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
  200. beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
  201. }
  202. }
  203. //执行BeanFactory后置处理器
  204. protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
  205. //执行BeanFactoryPostProcessor的方法
  206. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
  207. if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
  208. beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
  209. beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
  210. }
  211. }
  212. //执行BeanFactoryPostProcessor的方法
  213. public static void invokeBeanFactoryPostProcessors(
  214. ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
  215. Set<String> processedBeans = new HashSet<>();
  216. //判断bean是否属于BeanDefinitionRegistry
  217. if (beanFactory instanceof BeanDefinitionRegistry) {
  218. BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
  219. List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
  220. List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
  221. //拿到所有的BeanFactoryPostProcessor进行遍历
  222. for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
  223. if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
  224. //经过判断之后拿到所有的BeanDefinitionRegistryPostProcessor
  225. BeanDefinitionRegistryPostProcessor registryProcessor =
  226. (BeanDefinitionRegistryPostProcessor) postProcessor;
  227. registryProcessor.postProcessBeanDefinitionRegistry(registry);
  228. registryProcessors.add(registryProcessor);
  229. }
  230. else {
  231. regularPostProcessors.add(postProcessor);
  232. }
  233. }
  234. List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
  235. //跟据类型获取所有bean的名字
  236. String[] postProcessorNames =
  237. beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
  238. for (String ppName : postProcessorNames) {
  239. //PriorityOrdered: 判断是否实现了优先级排序
  240. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
  241. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
  242. processedBeans.add(ppName);
  243. }
  244. }
  245. //按优先级排序
  246. sortPostProcessors(currentRegistryProcessors, beanFactory);
  247. registryProcessors.addAll(currentRegistryProcessors);
  248. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
  249. currentRegistryProcessors.clear();
  250. }
  251. //跟据类型获取所有bean的名字
  252. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
  253. for (String ppName : postProcessorNames) {
  254. //判断是否实现了Ordered接口
  255. if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
  256. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
  257. processedBeans.add(ppName);
  258. }
  259. }
  260. //再排序
  261. sortPostProcessors(currentRegistryProcessors, beanFactory);
  262. registryProcessors.addAll(currentRegistryProcessors);
  263. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
  264. currentRegistryProcessors.clear();
  265. //最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessor
  266. boolean reiterate = true;
  267. while (reiterate) {
  268. reiterate = false;
  269. postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
  270. for (String ppName : postProcessorNames) {
  271. if (!processedBeans.contains(ppName)) {
  272. currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
  273. processedBeans.add(ppName);
  274. reiterate = true;
  275. }
  276. }
  277. sortPostProcessors(currentRegistryProcessors, beanFactory);
  278. registryProcessors.addAll(currentRegistryProcessors);
  279. invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
  280. currentRegistryProcessors.clear();
  281. }
  282. }
  283. //注册bean的后置处理器
  284. protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
  285. PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
  286. }
  287. //获取所有的BeanPostProcessor
  288. public static void registerBeanPostProcessors(
  289. ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
  290. String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
  291. //统计数量
  292. int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
  293. //检查
  294. beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
  295. List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
  296. List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
  297. List<String> orderedPostProcessorNames = new ArrayList<>();
  298. List<String> nonOrderedPostProcessorNames = new ArrayList<>();
  299. for (String ppName : postProcessorNames) {
  300. //通过实现优先级接口来指定优先级
  301. if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
  302. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  303. priorityOrderedPostProcessors.add(pp);
  304. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  305. internalPostProcessors.add(pp);
  306. }
  307. }
  308. else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
  309. orderedPostProcessorNames.add(ppName);
  310. }
  311. else {
  312. nonOrderedPostProcessorNames.add(ppName);
  313. }
  314. }
  315. //排序
  316. sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
  317. registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
  318. List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
  319. for (String ppName : orderedPostProcessorNames) {
  320. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  321. orderedPostProcessors.add(pp);
  322. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  323. internalPostProcessors.add(pp);
  324. }
  325. }
  326. sortPostProcessors(orderedPostProcessors, beanFactory);
  327. registerBeanPostProcessors(beanFactory, orderedPostProcessors);
  328. List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
  329. for (String ppName : nonOrderedPostProcessorNames) {
  330. BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
  331. nonOrderedPostProcessors.add(pp);
  332. if (pp instanceof MergedBeanDefinitionPostProcessor) {
  333. internalPostProcessors.add(pp);
  334. }
  335. }
  336. registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
  337. sortPostProcessors(internalPostProcessors, beanFactory);
  338. registerBeanPostProcessors(beanFactory, internalPostProcessors);
  339. beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
  340. }
  341. //初始化信息源,用来支持SpringMVC中的国际化功能(消息绑定、消息解析)
  342. protected void initMessageSource() {
  343. //获取BeanFactory
  344. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  345. //是否存在id为messageSource的组件
  346. if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
  347. this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
  348. if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
  349. HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
  350. if (hms.getParentMessageSource() == null) {
  351. hms.setParentMessageSource(getInternalParentMessageSource());
  352. }
  353. }
  354. if (logger.isDebugEnabled()) {
  355. logger.debug("Using MessageSource [" + this.messageSource + "]");
  356. }
  357. }
  358. else {
  359. //如果没有,默认创建一个DelegatingMessageSource
  360. DelegatingMessageSource dms = new DelegatingMessageSource();
  361. dms.setParentMessageSource(getInternalParentMessageSource());
  362. this.messageSource = dms;
  363. //最后把创建好的messageSource注册到容器中,以后获取国际化配置文件的值的时候,可以自动注入 messageSource
  364. beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
  365. if (logger.isDebugEnabled()) {
  366. logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME +
  367. "': using default [" + this.messageSource + "]");
  368. }
  369. }
  370. }
  371. //MessageSource: 可以取出国际化配置文件中某个key的值,能按照区域信息进行获取
  372. public interface MessageSource {
  373. @Nullable
  374. //获取国际化配置文件的值
  375. String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);
  376. }
  377. //初始化一些事件转化器(spring创建和销毁bean的时候会产生一些其他的事件,需要借助这些事件转化器处理)
  378. protected void initApplicationEventMulticaster() {
  379. //获取BeanFactory
  380. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  381. //是否有id为applicationEventMulticaster的组件
  382. if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
  383. this.applicationEventMulticaster =
  384. beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
  385. if (logger.isDebugEnabled()) {
  386. logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
  387. }
  388. }
  389. else {
  390. //如果没有,默认创建一个SimpleApplicationEventMulticaster
  391. this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
  392. beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
  393. if (logger.isDebugEnabled()) {
  394. logger.debug("Unable to locate ApplicationEventMulticaster with name '" +
  395. APPLICATION_EVENT_MULTICASTER_BEAN_NAME +
  396. "': using default [" + this.applicationEventMulticaster + "]");
  397. }
  398. }
  399. }
  400. //初始化一些其他的IOC容器,这是个空方法,留给子类实现的
  401. protected void onRefresh() throws BeansException {
  402. }
  403. //注册监听器
  404. protected void registerListeners() {
  405. for (ApplicationListener<?> listener : getApplicationListeners()) {
  406. getApplicationEventMulticaster().addApplicationListener(listener);
  407. }
  408. //从容器中拿到所有的ApplicationListener组件
  409. String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
  410. for (String listenerBeanName : listenerBeanNames) {
  411. //将每个监听器添加到事件转发器中
  412. getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
  413. }
  414. //将一些早期的事件也添加到事件转发器中
  415. Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
  416. this.earlyApplicationEvents = null;
  417. if (earlyEventsToProcess != null) {
  418. for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
  419. getApplicationEventMulticaster().multicastEvent(earlyEvent);
  420. }
  421. }
  422. }
  423. //完成BeanFactory的初始化,这个方法里面才是对bean的初始化,重点研究
  424. protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
  425. if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
  426. beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
  427. beanFactory.setConversionService(
  428. beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
  429. }
  430. if (!beanFactory.hasEmbeddedValueResolver()) {
  431. beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
  432. }
  433. String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
  434. for (String weaverAwareName : weaverAwareNames) {
  435. getBean(weaverAwareName);
  436. }
  437. beanFactory.setTempClassLoader(null);changes.
  438. beanFactory.freezeConfiguration();
  439. //重点: 初始化所有剩下的单实例bean
  440. beanFactory.preInstantiateSingletons();
  441. }
  442. //初始化所有剩下的单实例bean
  443. public void preInstantiateSingletons() throws BeansException {
  444. if (logger.isTraceEnabled()) {
  445. logger.trace("Pre-instantiating singletons in " + this);
  446. }
  447. List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
  448. for (String beanName : beanNames) {
  449. //拿到所有bean的定义信息
  450. RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
  451. //判断bean是否为非抽象、单例、非懒加载
  452. if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
  453. //判断是否为FactoryBean
  454. if (isFactoryBean(beanName)) {
  455. Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
  456. //是否实现了FactoryBean接口
  457. if (bean instanceof FactoryBean) {
  458. FactoryBean<?> factory = (FactoryBean<?>) bean;
  459. boolean isEagerInit;
  460. if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
  461. isEagerInit = AccessController.doPrivileged(
  462. (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
  463. getAccessControlContext());
  464. }
  465. else {
  466. isEagerInit = (factory instanceof SmartFactoryBean &&
  467. ((SmartFactoryBean<?>) factory).isEagerInit());
  468. }
  469. if (isEagerInit) {
  470. getBean(beanName);
  471. }
  472. }
  473. }
  474. //普通bean(不是FactoryBean)走这里
  475. else {
  476. getBean(beanName);
  477. }
  478. }
  479. }
  480. //获取所有的bean的名称 至此所有的单实例的bean已经加入到单实例Bean的缓存池中,所谓的单实例缓存池实际上就是一个ConcurrentHashMap
  481. for (String beanName : beanNames) {
  482. //从单例缓存池中获取所有的对象
  483. Object singletonInstance = getSingleton(beanName);
  484. //判断当前的bean是否实现了SmartInitializingSingleton接口
  485. if (singletonInstance instanceof SmartInitializingSingleton) {
  486. SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
  487. if (System.getSecurityManager() != null) {
  488. AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
  489. smartSingleton.afterSingletonsInstantiated();
  490. return null;
  491. }, getAccessControlContext());
  492. }
  493. else {
  494. smartSingleton.afterSingletonsInstantiated();
  495. }
  496. }
  497. }
  498. }
  499. public Object getBean(String name) throws BeansException {
  500. //真正的获取Bean的逻辑
  501. return doGetBean(name, null, null, false);
  502. }
  503. //调用doGetBean
  504. protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
  505. @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
  506. //在这里传入进来的name可能是别名、也有可能是工厂beanName,所以在这里需要转换
  507. final String beanName = transformedBeanName(name);
  508. Object bean;
  509. //先尝试去缓存中获取对象
  510. Object sharedInstance = getSingleton(beanName);
  511. if (sharedInstance != null && args == null) {
  512. if (logger.isDebugEnabled()) {
  513. if (isSingletonCurrentlyInCreation(beanName)) {
  514. logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
  515. "' that is not fully initialized yet - a consequence of a circular reference");
  516. }
  517. else {
  518. logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
  519. }
  520. }
  521. /**
  522. * 如果sharedInstance是普通的单例bean,下面的方法会直接返回。但如果
  523. * sharedInstance是FactoryBean类型的,则需调用getObject()工厂方法获取真正的
  524. * bean实例。如果用户想获取 FactoryBean 本身,这里也不会做特别的处理,直接返回
  525. * 即可。毕竟 FactoryBean 的实现类本身也是一种 bean,只不过具有一点特殊的功能而已。
  526. */
  527. bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
  528. }
  529. else {
  530. //Spring只能解决单例对象的setter注入的循环依赖,不能解决构造器注入,也不能解决多实例的循环依赖
  531. if (isPrototypeCurrentlyInCreation(beanName)) {
  532. throw new BeanCurrentlyInCreationException(beanName);
  533. }
  534. //如果缓存中没有,则会开始创建bean对象的流程
  535. //首先,判断是否有父工厂
  536. BeanFactory parentBeanFactory = getParentBeanFactory();
  537. //若存在父工厂,且当前的bean工厂中没有我们需要的bean的定义信息,那么bean定义信息则存在于 父beanFactory中
  538. if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
  539. //获取bean的原始名称
  540. String nameToLookup = originalBeanName(name);
  541. //若为AbstractBeanFactory类型,委托父类处理
  542. if (parentBeanFactory instanceof AbstractBeanFactory) {
  543. return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
  544. nameToLookup, requiredType, args, typeCheckOnly);
  545. }
  546. else if (args != null) {
  547. //委托给父类BeanFactory的getBean()处理
  548. return (T) parentBeanFactory.getBean(nameToLookup, args);
  549. }
  550. else {
  551. //没有args,委托给标准的getBean()处理
  552. return parentBeanFactory.getBean(nameToLookup, requiredType);
  553. }
  554. }
  555. /**
  556. * 方法参数typeCheckOnly ,是用来判断调用getBean(...) 方法时,表示是否为仅仅进行类型检查获取Bean对象
  557. * 如果不是仅仅做类型检查,而是创建Bean对象,则需要调用markBeanAsCreated(String beanName) 方法,进行标记
  558. */
  559. if (!typeCheckOnly) {
  560. markBeanAsCreated(beanName);
  561. }
  562. try {
  563. //从容器中获取beanName相应的GenericBeanDefinition对象,并将其转换为RootBeanDefinition对象
  564. final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
  565. //检查当前创建的bean定义是不是抽象的bean定义
  566. checkMergedBeanDefinition(mbd, beanName, args);
  567. //处理dependsOn的依赖(这个不是我们所谓的循环依赖 而是bean创建前后的依赖)
  568. //依赖bean的名称
  569. String[] dependsOn = mbd.getDependsOn();
  570. if (dependsOn != null) {
  571. for (String dep : dependsOn) {
  572. //beanName是当前正在创建的bean,dep是正在创建的bean的依赖的bean的名称
  573. if (isDependent(beanName, dep)) {
  574. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  575. "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
  576. }
  577. //保存的是依赖beanName之间的映射关系:依赖beanName -> beanName的集合
  578. registerDependentBean(dep, beanName);
  579. try {
  580. //获取dependsOn的bean
  581. getBean(dep);
  582. }
  583. catch (NoSuchBeanDefinitionException ex) {
  584. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  585. "'" + beanName + "' depends on missing bean '" + dep + "'", ex);
  586. }
  587. }
  588. }
  589. //是单实例则创建单例Bean
  590. if (mbd.isSingleton()) {
  591. //把beanName和一个singletonFactory匿名内部类传入用于回调
  592. sharedInstance = getSingleton(beanName, () -> {
  593. try {
  594. //创建bean
  595. //底层调用doCreateBean()返回bean实例
  596. return createBean(beanName, mbd, args);
  597. }
  598. catch (BeansException ex) {
  599. //创建bean的过程中发生异常,需要销毁关于当前bean的所有信息
  600. destroySingleton(beanName);
  601. throw ex;
  602. }
  603. });
  604. bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
  605. }
  606. //如果是多实例bean
  607. else if (mbd.isPrototype()) {
  608. Object prototypeInstance = null;
  609. try {
  610. beforePrototypeCreation(beanName);
  611. prototypeInstance = createBean(beanName, mbd, args);
  612. }
  613. finally {
  614. afterPrototypeCreation(beanName);
  615. }
  616. bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
  617. }
  618. else {
  619. String scopeName = mbd.getScope();
  620. final Scope scope = this.scopes.get(scopeName);
  621. if (scope == null) {
  622. throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
  623. }
  624. try {
  625. Object scopedInstance = scope.get(beanName, () -> {
  626. beforePrototypeCreation(beanName);
  627. try {
  628. return createBean(beanName, mbd, args);
  629. }
  630. finally {
  631. afterPrototypeCreation(beanName);
  632. }
  633. });
  634. bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
  635. }
  636. catch (IllegalStateException ex) {
  637. throw new BeanCreationException(beanName,
  638. "Scope '" + scopeName + "' is not active for the current thread; consider " +
  639. "defining a scoped proxy for this bean if you intend to refer to it from a singleton",
  640. ex);
  641. }
  642. }
  643. }
  644. catch (BeansException ex) {
  645. cleanupAfterBeanCreationFailure(beanName);
  646. throw ex;
  647. }
  648. }
  649. }
  650. //调用doCreateBean()方法返回一个bean实例
  651. protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
  652. throws BeanCreationException {
  653. //BeanWrapper是对Bean的包装,其接口中所定义的功能很简单包括设置获取被包装的对象,获取被包装bean的属性描述器等
  654. BeanWrapper instanceWrapper = null;
  655. if (mbd.isSingleton()) {
  656. //从没有完成的FactoryBean中移除
  657. instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
  658. }
  659. if (instanceWrapper == null) {
  660. //重点: 使用合适的实例化策略来创建新的实例:工厂方法、构造函数自动注入、简单初始化 比较复杂也 很重要
  661. instanceWrapper = createBeanInstance(beanName, mbd, args);
  662. }
  663. try {
  664. //给我们的属性进行赋值(调用set方法进行赋值),利用反射调用set方法
  665. populateBean(beanName, mbd, instanceWrapper);
  666. //进行对象初始化操作(在这里可能生成代理对象)
  667. exposedObject = initializeBean(beanName, exposedObject, mbd);
  668. }
  669. }
  670. //createBeanInstance: 创建bean实例
  671. protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
  672. //从bean定义中解析出当前bean的class对象
  673. Class<?> beanClass = resolveBeanClass(mbd, beanName);
  674. //检测类的访问权限。默认情况下,对于非 public 的类,是允许访问的。若禁止访问,这里会抛出异常
  675. if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
  676. throw new BeanCreationException(mbd.getResourceDescription(), beanName,
  677. "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
  678. }
  679. Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
  680. if (instanceSupplier != null) {
  681. return obtainFromSupplier(instanceSupplier, beanName);
  682. }
  683. //工厂方法,我们通过配置类来进行配置的话 采用的就是工厂方法
  684. if (mbd.getFactoryMethodName() != null) {
  685. return instantiateUsingFactoryMethod(beanName, mbd, args);
  686. }
  687. //判断当前构造函数是否被解析过
  688. boolean resolved = false;
  689. //有没有必须进行依赖注入
  690. boolean autowireNecessary = false;
  691. if (args == null) {
  692. synchronized (mbd.constructorArgumentLock) {
  693. //判断我们的bean定义信息中的resolvedConstructorOrFactoryMethod(用来缓存我们的已经解析的构造函数或者工厂方法)
  694. if (mbd.resolvedConstructorOrFactoryMethod != null) {
  695. //修改已经解析过的构造函数的标志
  696. resolved = true;
  697. //修改标记为ture 标识构造函数或者工厂方法已经解析过
  698. autowireNecessary = mbd.constructorArgumentsResolved;
  699. }
  700. }
  701. }
  702. //若被解析过
  703. if (resolved) {
  704. if (autowireNecessary) {
  705. //通过有参的构造函数进行反射调用
  706. return autowireConstructor(beanName, mbd, null, null);
  707. }
  708. else {
  709. //调用无参数的构造函数进行创建对象
  710. return instantiateBean(beanName, mbd);
  711. }
  712. }
  713. //通过bean的后置处理器选举出合适的构造函数创建对象
  714. Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
  715. //通过后置处理器解析出构造器对象不为null或获取bean定义中的注入模式是构造器注入或bean定义信息ConstructorArgumentValues或获取通过getBean的方式传入的构造器函数参数类型不为null
  716. if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
  717. mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
  718. //通过构造函数创建对象
  719. return autowireConstructor(beanName, mbd, ctors, args);
  720. }
  721. //使用无参数的构造函数调用创建对象
  722. return instantiateBean(beanName, mbd);
  723. }
  724. //先从缓存中获取对象
  725. public Object getSingleton(String beanName) {
  726. return getSingleton(beanName, true);
  727. }
  728. //这里涉及到Spring的三级缓存,可以用它来解决循环依赖
  729. protected Object getSingleton(String beanName, boolean allowEarlyReference) {
  730. //第一步:我们先尝试去一级缓存(单例缓存池中去获取对象,一般情况从该map中获取的对象是直接可以使用的)
  731. //Spring IoC容器初始化加载单实例bean的时候第一次进来的时候 该map一般返回null
  732. Object singletonObject = this.singletonObjects.get(beanName);
  733. //若在第一级缓存中没有获取到对象,并且singletonsCurrentlyInCreation正在创建的单实例的list包 含该beanName
  734. //Spring IoC容器初始化加载单实例bean的时候第一次进来的时候 该list中一般返回null,但是循环依赖的 时候可以满足该条件
  735. if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) {
  736. synchronized (this.singletonObjects) {
  737. //则尝试去二级缓存中获取对象(二级缓存中的对象是一个早期对象)
  738. //何为早期对象:就是bean刚刚调用了构造方法,还没给bean的属性进行赋值的对象就是早期对象
  739. singletonObject = this.earlySingletonObjects.get(beanName);
  740. //二级缓存中也没有获取到对象,allowEarlyReference为true(参数是有上一个方法传递进来的 true)
  741. if (singletonObject == null && allowEarlyReference) {
  742. //则直接从三级缓存中获取ObjectFactory对象 这个对象就是用来解决循环依赖的关键所在
  743. //在getBean的过程中,当bean调用了构造方法的时候,把早期对象包裹成一个 ObjectFactory暴露到三级缓存中
  744. ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
  745. //从三级缓存中获取到对象不为空
  746. if (singletonFactory != null) {
  747. //在这里通过暴露的ObjectFactory包装对象中,通过调用他的getObject()来获取我 们的早期对象
  748. //在这个环节中会调用到 getEarlyBeanReference()来进行后置处理
  749. singletonObject = singletonFactory.getObject();
  750. //把早期对象放置在二级缓存,
  751. this.earlySingletonObjects.put(beanName, singletonObject);
  752. //ObjectFactory 包装对象从三级缓存中删除掉
  753. this.singletonFactories.remove(beanName);
  754. }
  755. }
  756. }
  757. }
  758. return singletonObject;
  759. }
  760. //此时已经完成了容器的刷新
  761. protected void finishRefresh() {
  762. //清理缓存
  763. clearResourceCaches();
  764. //初始化跟生命周期有关的后置处理器,默认从容器找是否有id为lifecycleProcessor的组件,如果没有,就 默认创建DefaultLifecycleProcessor
  765. initLifecycleProcessor();
  766. //拿到生命周期处理器,然后回调onRefresh()
  767. getLifecycleProcessor().onRefresh();
  768. //发布事件-->容器刷新完成事件
  769. publishEvent(new ContextRefreshedEvent(this));
  770. LiveBeansView.registerApplicationContext(this);
  771. }
  772. //初始化跟生命周期有关的后置处理器
  773. protected void initLifecycleProcessor() {
  774. ConfigurableListableBeanFactory beanFactory = getBeanFactory();
  775. if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) {
  776. this.lifecycleProcessor =
  777. beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class);
  778. if (logger.isDebugEnabled()) {
  779. logger.debug("Using LifecycleProcessor [" + this.lifecycleProcessor + "]");
  780. }
  781. }
  782. else {
  783. DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor();
  784. defaultProcessor.setBeanFactory(beanFactory);
  785. this.lifecycleProcessor = defaultProcessor;
  786. beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor);
  787. if (logger.isDebugEnabled()) {
  788. logger.debug("Unable to locate LifecycleProcessor with name '" +
  789. LIFECYCLE_PROCESSOR_BEAN_NAME +
  790. "': using default [" + this.lifecycleProcessor + "]");
  791. }
  792. }
  793. }

2. Aop面向切面

3. 声明式事务

/*
原理: @EnableTransactionManagement-->开启基于声明式事务的注解开发
    1. 利用TransactionManagementConfigurationSelector给容器中导入两个组件
        AutoProxyRegistrar、ProxyTransactionManagementConfiguration
    2. AutoProxyRegistrar: 实现了ImportBeanDefinitionRegistrar给容器中注册了一个               InfrastructureAdvisorAutoProxyCreator组件
            InfrastructureAdvisorAutoProxyCreator: 利用后置处理器机制在对象创建以后,包装对                象,返回一个代理对象(增强器),代理对象执行方法利用拦截器链进行调用
    3. ProxyTransactionManagementConfiguration: 
          1. 给容器中注册事务增强器,事务增强器使用AnnotationTransactionAttributeSource解析事              务注解
          2. 给容器中注册事务拦截器TransactionInterceptor,该拦截器保存了事务的属性信息,以及事              务管理器(底层是一个MethodInterceptor方法拦截器)
          3. MethodInterceptor: 在目标方法执行的时候执行拦截器链
          4. 事务拦截器:
                  1. 先获取事务相关的属性、再获取PlatformTransactionManager
                2. 如果事先没有添加任何的transactionManager,则最终会从容器中按照类型获取一个                      PlatformTransactionManager
                3. 执行目标方法时出现异常,获取到事务管理器,利用事务管理回滚操作
                   如果正常,利用事务管理器提交事务   
*/

//源码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({TransactionManagementConfigurationSelector.class})
public @interface EnableTransactionManagement {
    boolean proxyTargetClass() default false;    //默认false

    AdviceMode mode() default AdviceMode.PROXY;  //默认是proxy

    int order() default 2147483647;
}


public class TransactionManagementConfigurationSelector extends AdviceModeImportSelector<EnableTransactionManagement> {
    public TransactionManagementConfigurationSelector() {
    }

    protected String[] selectImports(AdviceMode adviceMode) {
        switch(adviceMode) {
            case PROXY:   //创建一个String数组: AutoProxyRegistrar
            return new String[]{AutoProxyRegistrar.class.getName(), ProxyTransactionManagementConfiguration.class.getName()};
        case ASPECTJ:
            return new String[]{"org.springframework.transaction.aspectj.AspectJTransactionManagementConfiguration"};
        default:
            return null;
        }
    }
}


//实现ImportBeanDefinitionRegistrar接口
public class AutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        boolean candidateFound = false;
        Set<String> annoTypes = importingClassMetadata.getAnnotationTypes();
        for (String annoType : annoTypes) {
            AnnotationAttributes candidate = AnnotationConfigUtils.attributesFor(importingClassMetadata, annoType);
            if (candidate == null) {
                continue;
            }
            Object mode = candidate.get("mode");
            Object proxyTargetClass = candidate.get("proxyTargetClass");
            if (mode != null && proxyTargetClass != null && AdviceMode.class == mode.getClass() &&
                    Boolean.class == proxyTargetClass.getClass()) {
                candidateFound = true;
                if (mode == AdviceMode.PROXY) {   //默认就是proxy对象
                    AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
                    if ((Boolean) proxyTargetClass) {   //默认返回false
                        AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
                        return;
                    }
                }
            }
        }
}


@Nullable
    public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry) {
        return registerAutoProxyCreatorIfNecessary(registry, (Object)null);
    }

@Nullable
public static BeanDefinition registerAutoProxyCreatorIfNecessary(BeanDefinitionRegistry registry, @Nullable Object source) {
        return registerOrEscalateApcAsRequired(InfrastructureAdvisorAutoProxyCreator.class, registry, source);
}


@Configuration
public class ProxyTransactionManagementConfiguration extends AbstractTransactionManagementConfiguration {
    @Bean(
        name = {"org.springframework.transaction.config.internalTransactionAdvisor"}
    )
    @Role(2)
    public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
        BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
        //添加事务属性源
        advisor.setTransactionAttributeSource(this.transactionAttributeSource());
        advisor.setAdvice(this.transactionInterceptor());
        if (this.enableTx != null) {
            advisor.setOrder((Integer)this.enableTx.getNumber("order"));
        }

        return advisor;
    }

    @Bean
    @Role(2)
    public TransactionAttributeSource transactionAttributeSource() {
        return new AnnotationTransactionAttributeSource();
    }

    @Bean
    @Role(2)
    public TransactionInterceptor transactionInterceptor() {
        TransactionInterceptor interceptor = new TransactionInterceptor();
       //保存事务属性
       interceptor.setTransactionAttributeSource(this.transactionAttributeSource());
        if (this.txManager != null) {
            interceptor.setTransactionManager(this.txManager);  //保存事务增强器
        }
        return interceptor;
    }
}


public class AnnotationTransactionAttributeSource extends AbstractFallbackTransactionAttributeSource implements Serializable {
    public AnnotationTransactionAttributeSource(boolean publicMethodsOnly) {
        this.publicMethodsOnly = publicMethodsOnly;
        this.annotationParsers = new LinkedHashSet(2);
        //注解解析器: 解析spring事务的一些注解
        this.annotationParsers.add(new SpringTransactionAnnotationParser());
        if (jta12Present) {
            this.annotationParsers.add(new JtaTransactionAnnotationParser());
        }

        if (ejb3Present) {
            this.annotationParsers.add(new Ejb3TransactionAnnotationParser());
        }

    }
}


//各种事务注解的解析
public class SpringTransactionAnnotationParser implements TransactionAnnotationParser, Serializable {
    protected TransactionAttribute parseTransactionAnnotation(AnnotationAttributes attributes) {
        RuleBasedTransactionAttribute rbta = new RuleBasedTransactionAttribute();
        Propagation propagation = (Propagation)attributes.getEnum("propagation");
        rbta.setPropagationBehavior(propagation.value());
        Isolation isolation = (Isolation)attributes.getEnum("isolation");
        rbta.setIsolationLevel(isolation.value());
        rbta.setTimeout(attributes.getNumber("timeout").intValue());
        rbta.setReadOnly(attributes.getBoolean("readOnly"));
        rbta.setQualifier(attributes.getString("value"));
        ArrayList<RollbackRuleAttribute> rollBackRules = new ArrayList();
        Class<?>[] rbf = attributes.getClassArray("rollbackFor");
    }
}


//底层实际上是一个方法拦截器
public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor, Serializable {
    public TransactionInterceptor(PlatformTransactionManager ptm, Properties attributes) {
        this.setTransactionManager(ptm);
        this.setTransactionAttributes(attributes);
    }

    //实际上就是代理对象在执行
    @Nullable
    public Object invoke(MethodInvocation invocation) throws Throwable {
        Class<?> targetClass = invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null;
        Method var10001 = invocation.getMethod();
        invocation.getClass();
        return this.invokeWithinTransaction(var10001, targetClass, invocation::proceed);
    }
}



@Nullable
    protected Object invokeWithinTransaction(Method method, @Nullable Class<?> targetClass, TransactionAspectSupport.InvocationCallback invocation) throws Throwable {
        TransactionAttributeSource tas = this.getTransactionAttributeSource();
        TransactionAttribute txAttr = tas != null ? tas.getTransactionAttribute(method, targetClass) : null;
        //获取PlatformTransactionManager
        PlatformTransactionManager tm = this.determineTransactionManager(txAttr);
        String joinpointIdentification = this.methodIdentification(method, targetClass, txAttr);


@Nullable
    protected PlatformTransactionManager determineTransactionManager(@Nullable TransactionAttribute txAttr) {
        if (txAttr != null && this.beanFactory != null) {
            String qualifier = txAttr.getQualifier();
            if (StringUtils.hasText(qualifier)) {
                return this.determineQualifiedTransactionManager(this.beanFactory, qualifier);
            } else if (StringUtils.hasText(this.transactionManagerBeanName)) {
                return this.determineQualifiedTransactionManager(this.beanFactory, this.transactionManagerBeanName);
            } else {
                PlatformTransactionManager defaultTransactionManager = this.getTransactionManager();
                if (defaultTransactionManager == null) {
                    defaultTransactionManager = (PlatformTransactionManager)this.transactionManagerCache.get(DEFAULT_TRANSACTION_MANAGER_KEY);
                    //默认为容器中添加PlatformTransactionManager
                    if (defaultTransactionManager == null) {
                        defaultTransactionManager = (PlatformTransactionManager)this.beanFactory.getBean(PlatformTransactionManager.class);
                        this.transactionManagerCache.putIfAbsent(DEFAULT_TRANSACTION_MANAGER_KEY, defaultTransactionManager);
                    }
                }

                return defaultTransactionManager;
            }
        } else {
            return this.getTransactionManager();
        }
        if (txAttr != null && tm instanceof CallbackPreferringPlatformTransactionManager) {
            TransactionAspectSupport.ThrowableHolder throwableHolder = new TransactionAspectSupport.ThrowableHolder();

            try {
                result = ((CallbackPreferringPlatformTransactionManager)tm).execute(txAttr, (status) -> {
                    TransactionAspectSupport.TransactionInfo txInfo = this.prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);

                    Object var9;
                    try {
                        Object var8 = invocation.proceedWithInvocation();
                        return var8;
                    } catch (Throwable var13) {
                        if (txAttr.rollbackOn(var13)) {
                            if (var13 instanceof RuntimeException) {
                                throw (RuntimeException)var13;
                            }

                            throw new TransactionAspectSupport.ThrowableHolderException(var13);
                        }

                        throwableHolder.throwable = var13;
                        var9 = null;
                    } finally {
                        this.cleanupTransactionInfo(txInfo);
                    }

                    return var9;
                });
                if (throwableHolder.throwable != null) {
                    throw throwableHolder.throwable;
                } else {
                    return result;
                }
            } catch (TransactionAspectSupport.ThrowableHolderException var19) {
                throw var19.getCause();
            } catch (TransactionSystemException var20) {
                if (throwableHolder.throwable != null) {
                    this.logger.error("Application exception overridden by commit exception", throwableHolder.throwable);
                    var20.initApplicationException(throwableHolder.throwable);
                }

                throw var20;
            } catch (Throwable var21) {
                if (throwableHolder.throwable != null) {
                    this.logger.error("Application exception overridden by commit exception", throwableHolder.throwable);
                }

                throw var21;
            }
        } else {
            TransactionAspectSupport.TransactionInfo txInfo = this.createTransactionIfNecessary(tm, txAttr, joinpointIdentification);
            result = null;

            try {
                result = invocation.proceedWithInvocation();
            } catch (Throwable var17) {
                //如果出现了异常,就会回滚
                this.completeTransactionAfterThrowing(txInfo, var17);
                throw var17;
            } finally {
                this.cleanupTransactionInfo(txInfo);
            }

            this.commitTransactionAfterReturning(txInfo);
            return result;
        }
    }
}


//回滚
protected void completeTransactionAfterThrowing(@Nullable TransactionAspectSupport.TransactionInfo txInfo, Throwable ex) {
        if (txInfo != null && txInfo.getTransactionStatus() != null) {
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("Completing transaction for [" + txInfo.getJoinpointIdentification() + "] after exception: " + ex);
            }

            if (txInfo.transactionAttribute != null && txInfo.transactionAttribute.rollbackOn(ex)) {
                try {

                txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());  //回滚
                } catch (TransactionSystemException var6) {
                    this.logger.error("Application exception overridden by rollback exception", ex);
                    var6.initApplicationException(ex);
                    throw var6;
                } catch (Error | RuntimeException var7) {
                    this.logger.error("Application exception overridden by rollback exception", ex);
                    throw var7;
                }
            } else {
                try {
                    txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());
                } catch (TransactionSystemException var4) {
                    this.logger.error("Application exception overridden by commit exception", ex);
                    var4.initApplicationException(ex);
                    throw var4;
                } catch (Error | RuntimeException var5) {
                    this.logger.error("Application exception overridden by commit exception", ex);
                    throw var5;
                }
            }
        }

}

4. Spring的一些高频面试题

1. BeanFactory和ApplicationContext的区别

/*
1. BeanFactory: bean工厂接口,负责创建bean实例,是Spring最底层的接口
2. ApplicationContext: 是BeanFactory的子接口,更多的是负责容器功能的实现,可以基于BeanFactory创建好的对象之上完成强大的容器功能,容器从map中获取bean,并且实现AOP功能,都依赖于ApplicationContext
3. 综上所述: BeanFactory是最底层的接口,ApplicationContext是BeanFactory的子接口,是留给程序员使用的IOC接口
*/

SpringMVC源码分析

MyBatis源码分析