Spring源码分析
1. IOC容器的创建
/*我们需要清楚: 1. IOC是一个容器 2. 容器启动的时候会创建所有的单实例bean 3. 我们可以直接从容器中获取到某个bean我们需要了解: 1. IOC容器的创建过程 2. 容器启动期间做了些什么、什么时候创建的所有单实例bean 3. IOC是如何创建这些单实例bean,并且进行管理的,最后将这些bean保存在什么地方源码: 从HelloWorld开始,进行debug调试,边调试边查看控制台的打印=============================BeanFactory的创建以及准备工作==============================Spring容器的refresh()--->刷新容器 1. prepareRefresh()--->刷新前的预处理 initPropertySources()-->初始化一些属性设置(空方法,留给子类实现的) getEnvironment().validateRequiredProperties();-->校验属性的合法性 this.earlyApplicationEvents = new LinkedHashSet<>();-->保存容器中一些早期的事件 2. obtainFreshBeanFactory();--->获取BeanFactory refreshBeanFactory();-->刷新(创建)BeanFactory getBeanFactory();-->获取BeanFactory 将BeanFactory返回 3. prepareBeanFactory(beanFactory);--->BeanFactory的预准备工作(对BeanFactory进行一些 设置) 设置BeanFactory的类加载器、支持表达式解析器等... 添加部分BeanPostProcessor后置处理器(ApplicationContextAwareProcessor) 设置一些忽略的自动装配的接口 注册可以解析的自动装配,使得我们可以直接在任何组件中进行自动注入 添加了BeanPostProcessor后置处理器(ApplicationListenerDetector) 给Bean中注册一些其他有用的组件(比如: 与环境有关的组件) 4. postProcessBeanFactory(beanFactory);--->BeanFactory准备工作完成之后进行的一些后置处 理工作(空方法,留给子类使用)=================================================================================== 5. invokeBeanFactoryPostProcessors(beanFactory);--->执行BeanFactory后置处理器,在 BeanFactory标准初始化之后执行 先获取所有的BeanFactoryPostProcessor进行遍历 经过判断之后拿到所有的BeanDefinitionRegistryPostProcessor 跟据类型获取所有bean的名字,再按照优先级进排序 然后判断是否实现了Ordered顺序接口,再排序 最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessor 6. registerBeanPostProcessors(beanFactory);--->注册bean的后置处理器(作用: 拦截bean的创 建过程) 获取所有的BeanPostProcessor 后置处理器默认也是可以通过实现接口PriorityOrdered、Ordered来指定优先级 先注册实现了PriorityOrdered优先级接口的BeanPostProcessor,然后添加到BeanFactory中 再注册实现了Ordered顺序接口的BeanPostProcessor 最后注册没有实现任何优先级接口的BeanPostProcessor 7. initMessageSource();--->初始化信息源,支持SpringMVC中的国际化功能(消息绑定、消息解析) 获取BeanFactory 然后查看容器中是否有id为messageSource的组件,如果有,直接赋值给messageSource属性,如果 没有,则自己创建一个DelegatingMessageSource MessageSource: 可以取出国际化配置文件中某个key的值,能按照区域信息进行获取 最后把创建好的messageSource注册到容器中,以后获取国际化配置文件的值的时候,可以自动注入 messageSource 8. initApplicationEventMulticaster--->初始化一些事件转化器(spring创建和销毁bean的时候会 产生一些其他的事件,需要借助这些事件转化器处理) 获取BeanFactory 然后从BeanFactory中获取applicationEventMulticaster 如果没有获取到,就会默认创建一个SimpleApplicationEventMulticaster,将创建的 applicationEventMulticaster添加到BeanFactory中,以后使用的时候可以自动注入 9. onRefresh();--->初始化一些其他的组件,这是个空方法,留给子类实现的 子类可以重写该方法,在容器刷新的时候自定义一些其他组件 10. registerListeners();--->注册监听器 从容器中拿到所有的ApplicationListener组件 然后将每个监听器添加到事件转发器中 最后将一些早期的事件也添加到事件转发器中 11. finishBeanFactoryInitialization(beanFactory);--->完成BeanFactory的初始化,这个方 法里面才是对bean的初始化,重点研究 beanFactory.preInstantiateSingletons();-->初始化剩下的所有单实例bean 先获取容器中的所有bean,依次进行初始化和创建对象 获取bean的定义信息-->RootBeanDefinition 判断bean是否为抽象、单实例、懒加载的 判断是否为FactoryBean,也就是工厂bean(是否实现了FactoryBean接口) getBean(beanName)-->才是真正的获取bean getBean方法内部调用doGetBean()方法-->重点方法 先获取缓存中保存的单实例bean,如果能获取到说明这个bean之前已经创建过,则直接返回 若缓存中没有,则开始bean的创建对象流程 先标记当前bean已经被创建,然后获取bean的定义信息 获取当前bean依赖的其他bean的信息,如果有,则先把当前bean所依赖的bean创建出来 启动单实例bean的创建流程: createBean(beanName, mbd, args); createBean底层又会调用doCreateBean()方法来创建bean实例 doCreateBean()方法底层调用createBeanInstance()方法创建bean实例 12. finishRefresh();--->完成BeanFactory的初始化创建工作,IOC容器创建完成====================================================================================总结: 1. Spring容器启动的时候,会先保存所有注册进来的bean的定义信息 xml配置文件注册bean--> <bean></bean> 注解方式注册bean--> @Bean、@Service、@Controller... 2. Spring容器会在合适的时机创建这些bean 用到这个bean的时候,调用getBean()方法创建bean,再保存到容器中 统一创建剩下所有bean的时候,调用finishBeanFactoryInitialization(beanFactory) 3. 后置处理器: 每一个bean创建完成之后,都会使用各种各样的后置处理器进行处理,增强bean的功能 AutowiredAnnotationBeanPostProcessor: 处理自动注入 AnnotationAwareAspectJAutoProxyCreator: 开发aop的功能,帮助我们创建代理对象 4. 事件驱动模型: ApplicationListener进行事件监听*///源码public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); register(annotatedClasses); refresh(); //所有单实例bean创建完成}//刷新容器@Overridepublic void refresh() throws BeansException, IllegalStateException { //保证多线程情况下,IOC容器只会被创建一次 synchronized (this.startupShutdownMonitor) { //预处理--->准备刷新容器 prepareRefresh(); //ConfigurableListableBeanFactory是BeanFactory的子类 //这里准备了一个创建所有bean的工厂 //这一步,spring会解析xml配置文件将要创建的所有bean,并加入到beanDefinitionMap中 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); //此时所有的bean已经加入到beanFactory中,准备beanFactory(预准备) prepareBeanFactory(beanFactory); try { //BeanFactory准备工作完成之后进行的一些后置处理工作(空方法,留给子类使用) postProcessBeanFactory(beanFactory); //执行BeanFactory后置处理器,在BeanFactory标准初始化之后执行 invokeBeanFactoryPostProcessors(beanFactory); //注册bean的后置处理器 registerBeanPostProcessors(beanFactory); //初始化信息源,用来支持SpringMVC中的国际化功能(消息绑定、消息解析) initMessageSource(); //初始化一些事件转化器(spring创建和销毁bean的时候会产生一些其他的事件,需要借助这些事件 转化器处理) initApplicationEventMulticaster(); //初始化一些其他的组件,这是个空方法,留给子类实现的 onRefresh(); //注册监听器 registerListeners(); //完成BeanFactory的初始化,这个方法里面才是对bean的初始化,重点研究 finishBeanFactoryInitialization(beanFactory); //此时已经完成了容器的刷新 finishRefresh(); } catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " +"cancelling refresh attempt: " + ex); } destroyBeans(); cancelRefresh(ex); throw ex; } finally { resetCommonCaches(); } }}//预处理protected void prepareRefresh() { this.startupDate = System.currentTimeMillis(); this.closed.set(false); this.active.set(true); if (logger.isInfoEnabled()) { logger.info("Refreshing " + this); } //空方法,留给子类实现 initPropertySources(); //校验属性的合法性 getEnvironment().validateRequiredProperties(); //保存容器中一些早期的时间 this.earlyApplicationEvents = new LinkedHashSet<>();}//获取BeanFactoryprotected ConfigurableListableBeanFactory obtainFreshBeanFactory() { //先刷新BeanFactory refreshBeanFactory(); //获取BeanFactory ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (logger.isDebugEnabled()) { logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory); } return beanFactory; //返回BeanFactory}//BeanFactory的预准备工作protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { //设置类加载器 beanFactory.setBeanClassLoader(getClassLoader()); //设置表达式解析器 beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment())); //添加ApplicationContextAwareProcessor beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); //设置一些忽略的自动装配的接口 beanFactory.ignoreDependencyInterface(EnvironmentAware.class); beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class); beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class); beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class); beanFactory.ignoreDependencyInterface(MessageSourceAware.class); beanFactory.ignoreDependencyInterface(ApplicationContextAware.class); //注册可以解析的自动装配,使得我们可以直接在任何组件中进行自动注入 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory); beanFactory.registerResolvableDependency(ResourceLoader.class, this); beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this); beanFactory.registerResolvableDependency(ApplicationContext.class, this); //添加了BeanPostProcessor后置处理器 beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this)); //给Bean中注册一些其他有用的组件(比如: 与环境有关的组件) if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); } if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment()); } if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties()); } if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) { beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment()); }}//执行BeanFactory后置处理器protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { //执行BeanFactoryPostProcessor的方法 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); }}//执行BeanFactoryPostProcessor的方法public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { Set<String> processedBeans = new HashSet<>(); //判断bean是否属于BeanDefinitionRegistry if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(); List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); //拿到所有的BeanFactoryPostProcessor进行遍历 for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) { if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) { //经过判断之后拿到所有的BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor; registryProcessor.postProcessBeanDefinitionRegistry(registry); registryProcessors.add(registryProcessor); } else { regularPostProcessors.add(postProcessor); } } List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>(); //跟据类型获取所有bean的名字 String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { //PriorityOrdered: 判断是否实现了优先级排序 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } //按优先级排序 sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); } //跟据类型获取所有bean的名字 postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { //判断是否实现了Ordered接口 if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); } } //再排序 sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); //最后执行没有实现任何优先级或者是顺序接口的BeanDefinitionRegistryPostProcessor boolean reiterate = true; while (reiterate) { reiterate = false; postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false); for (String ppName : postProcessorNames) { if (!processedBeans.contains(ppName)) { currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); processedBeans.add(ppName); reiterate = true; } } sortPostProcessors(currentRegistryProcessors, beanFactory); registryProcessors.addAll(currentRegistryProcessors); invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); currentRegistryProcessors.clear(); }}//注册bean的后置处理器protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}//获取所有的BeanPostProcessorpublic static void registerBeanPostProcessors( ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) { String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false); //统计数量 int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length; //检查 beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount)); List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>(); List<BeanPostProcessor> internalPostProcessors = new ArrayList<>(); List<String> orderedPostProcessorNames = new ArrayList<>(); List<String> nonOrderedPostProcessorNames = new ArrayList<>(); for (String ppName : postProcessorNames) { //通过实现优先级接口来指定优先级 if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); priorityOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) { orderedPostProcessorNames.add(ppName); } else { nonOrderedPostProcessorNames.add(ppName); } } //排序 sortPostProcessors(priorityOrderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors); List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(); for (String ppName : orderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); orderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } sortPostProcessors(orderedPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, orderedPostProcessors); List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(); for (String ppName : nonOrderedPostProcessorNames) { BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class); nonOrderedPostProcessors.add(pp); if (pp instanceof MergedBeanDefinitionPostProcessor) { internalPostProcessors.add(pp); } } registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors); sortPostProcessors(internalPostProcessors, beanFactory); registerBeanPostProcessors(beanFactory, internalPostProcessors); beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));}//初始化信息源,用来支持SpringMVC中的国际化功能(消息绑定、消息解析)protected void initMessageSource() { //获取BeanFactory ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //是否存在id为messageSource的组件 if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) { this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class); if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) { HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource; if (hms.getParentMessageSource() == null) { hms.setParentMessageSource(getInternalParentMessageSource()); } } if (logger.isDebugEnabled()) { logger.debug("Using MessageSource [" + this.messageSource + "]"); } } else { //如果没有,默认创建一个DelegatingMessageSource DelegatingMessageSource dms = new DelegatingMessageSource(); dms.setParentMessageSource(getInternalParentMessageSource()); this.messageSource = dms; //最后把创建好的messageSource注册到容器中,以后获取国际化配置文件的值的时候,可以自动注入 messageSource beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource); if (logger.isDebugEnabled()) { logger.debug("Unable to locate MessageSource with name '" + MESSAGE_SOURCE_BEAN_NAME + "': using default [" + this.messageSource + "]"); } }}//MessageSource: 可以取出国际化配置文件中某个key的值,能按照区域信息进行获取public interface MessageSource { @Nullable //获取国际化配置文件的值 String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);}//初始化一些事件转化器(spring创建和销毁bean的时候会产生一些其他的事件,需要借助这些事件转化器处理)protected void initApplicationEventMulticaster() { //获取BeanFactory ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //是否有id为applicationEventMulticaster的组件 if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) { this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class); if (logger.isDebugEnabled()) { logger.debug("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]"); } } else { //如果没有,默认创建一个SimpleApplicationEventMulticaster this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory); beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster); if (logger.isDebugEnabled()) { logger.debug("Unable to locate ApplicationEventMulticaster with name '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "': using default [" + this.applicationEventMulticaster + "]"); } }}//初始化一些其他的IOC容器,这是个空方法,留给子类实现的protected void onRefresh() throws BeansException {}//注册监听器protected void registerListeners() { for (ApplicationListener<?> listener : getApplicationListeners()) { getApplicationEventMulticaster().addApplicationListener(listener); } //从容器中拿到所有的ApplicationListener组件 String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false); for (String listenerBeanName : listenerBeanNames) { //将每个监听器添加到事件转发器中 getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName); } //将一些早期的事件也添加到事件转发器中 Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents; this.earlyApplicationEvents = null; if (earlyEventsToProcess != null) { for (ApplicationEvent earlyEvent : earlyEventsToProcess) { getApplicationEventMulticaster().multicastEvent(earlyEvent); } }}//完成BeanFactory的初始化,这个方法里面才是对bean的初始化,重点研究protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) { beanFactory.setConversionService( beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)); } if (!beanFactory.hasEmbeddedValueResolver()) { beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal)); } String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false); for (String weaverAwareName : weaverAwareNames) { getBean(weaverAwareName); } beanFactory.setTempClassLoader(null);changes. beanFactory.freezeConfiguration(); //重点: 初始化所有剩下的单实例bean beanFactory.preInstantiateSingletons();}//初始化所有剩下的单实例beanpublic void preInstantiateSingletons() throws BeansException { if (logger.isTraceEnabled()) { logger.trace("Pre-instantiating singletons in " + this); } List<String> beanNames = new ArrayList<>(this.beanDefinitionNames); for (String beanName : beanNames) { //拿到所有bean的定义信息 RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); //判断bean是否为非抽象、单例、非懒加载 if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { //判断是否为FactoryBean if (isFactoryBean(beanName)) { Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); //是否实现了FactoryBean接口 if (bean instanceof FactoryBean) { FactoryBean<?> factory = (FactoryBean<?>) bean; boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged( (PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit, getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean<?>) factory).isEagerInit()); } if (isEagerInit) { getBean(beanName); } } } //普通bean(不是FactoryBean)走这里 else { getBean(beanName); } } } //获取所有的bean的名称 至此所有的单实例的bean已经加入到单实例Bean的缓存池中,所谓的单实例缓存池实际上就是一个ConcurrentHashMap for (String beanName : beanNames) { //从单例缓存池中获取所有的对象 Object singletonInstance = getSingleton(beanName); //判断当前的bean是否实现了SmartInitializingSingleton接口 if (singletonInstance instanceof SmartInitializingSingleton) { SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction<Object>) () -> { smartSingleton.afterSingletonsInstantiated(); return null; }, getAccessControlContext()); } else { smartSingleton.afterSingletonsInstantiated(); } } }}public Object getBean(String name) throws BeansException { //真正的获取Bean的逻辑 return doGetBean(name, null, null, false);}//调用doGetBeanprotected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { //在这里传入进来的name可能是别名、也有可能是工厂beanName,所以在这里需要转换 final String beanName = transformedBeanName(name); Object bean; //先尝试去缓存中获取对象 Object sharedInstance = getSingleton(beanName); if (sharedInstance != null && args == null) { if (logger.isDebugEnabled()) { if (isSingletonCurrentlyInCreation(beanName)) { logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference"); } else { logger.debug("Returning cached instance of singleton bean '" + beanName + "'"); } } /** * 如果sharedInstance是普通的单例bean,下面的方法会直接返回。但如果 * sharedInstance是FactoryBean类型的,则需调用getObject()工厂方法获取真正的 * bean实例。如果用户想获取 FactoryBean 本身,这里也不会做特别的处理,直接返回 * 即可。毕竟 FactoryBean 的实现类本身也是一种 bean,只不过具有一点特殊的功能而已。 */ bean = getObjectForBeanInstance(sharedInstance, name, beanName, null); } else { //Spring只能解决单例对象的setter注入的循环依赖,不能解决构造器注入,也不能解决多实例的循环依赖 if (isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } //如果缓存中没有,则会开始创建bean对象的流程 //首先,判断是否有父工厂 BeanFactory parentBeanFactory = getParentBeanFactory(); //若存在父工厂,且当前的bean工厂中没有我们需要的bean的定义信息,那么bean定义信息则存在于 父beanFactory中 if (parentBeanFactory != null && !containsBeanDefinition(beanName)) { //获取bean的原始名称 String nameToLookup = originalBeanName(name); //若为AbstractBeanFactory类型,委托父类处理 if (parentBeanFactory instanceof AbstractBeanFactory) { return ((AbstractBeanFactory) parentBeanFactory).doGetBean( nameToLookup, requiredType, args, typeCheckOnly); } else if (args != null) { //委托给父类BeanFactory的getBean()处理 return (T) parentBeanFactory.getBean(nameToLookup, args); } else { //没有args,委托给标准的getBean()处理 return parentBeanFactory.getBean(nameToLookup, requiredType); } } /** * 方法参数typeCheckOnly ,是用来判断调用getBean(...) 方法时,表示是否为仅仅进行类型检查获取Bean对象 * 如果不是仅仅做类型检查,而是创建Bean对象,则需要调用markBeanAsCreated(String beanName) 方法,进行标记 */ if (!typeCheckOnly) { markBeanAsCreated(beanName); } try { //从容器中获取beanName相应的GenericBeanDefinition对象,并将其转换为RootBeanDefinition对象 final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName); //检查当前创建的bean定义是不是抽象的bean定义 checkMergedBeanDefinition(mbd, beanName, args); //处理dependsOn的依赖(这个不是我们所谓的循环依赖 而是bean创建前后的依赖) //依赖bean的名称 String[] dependsOn = mbd.getDependsOn(); if (dependsOn != null) { for (String dep : dependsOn) { //beanName是当前正在创建的bean,dep是正在创建的bean的依赖的bean的名称 if (isDependent(beanName, dep)) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'"); } //保存的是依赖beanName之间的映射关系:依赖beanName -> beanName的集合 registerDependentBean(dep, beanName); try { //获取dependsOn的bean getBean(dep); } catch (NoSuchBeanDefinitionException ex) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", ex); } } } //是单实例则创建单例Bean if (mbd.isSingleton()) { //把beanName和一个singletonFactory匿名内部类传入用于回调 sharedInstance = getSingleton(beanName, () -> { try { //创建bean //底层调用doCreateBean()返回bean实例 return createBean(beanName, mbd, args); } catch (BeansException ex) { //创建bean的过程中发生异常,需要销毁关于当前bean的所有信息 destroySingleton(beanName); throw ex; } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } //如果是多实例bean else if (mbd.isPrototype()) { Object prototypeInstance = null; try { beforePrototypeCreation(beanName); prototypeInstance = createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd); } else { String scopeName = mbd.getScope(); final Scope scope = this.scopes.get(scopeName); if (scope == null) { throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'"); } try { Object scopedInstance = scope.get(beanName, () -> { beforePrototypeCreation(beanName); try { return createBean(beanName, mbd, args); } finally { afterPrototypeCreation(beanName); } }); bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd); } catch (IllegalStateException ex) { throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider " + "defining a scoped proxy for this bean if you intend to refer to it from a singleton", ex); } } } catch (BeansException ex) { cleanupAfterBeanCreationFailure(beanName); throw ex; } }}//调用doCreateBean()方法返回一个bean实例protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException { //BeanWrapper是对Bean的包装,其接口中所定义的功能很简单包括设置获取被包装的对象,获取被包装bean的属性描述器等 BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { //从没有完成的FactoryBean中移除 instanceWrapper = this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { //重点: 使用合适的实例化策略来创建新的实例:工厂方法、构造函数自动注入、简单初始化 比较复杂也 很重要 instanceWrapper = createBeanInstance(beanName, mbd, args); } try { //给我们的属性进行赋值(调用set方法进行赋值),利用反射调用set方法 populateBean(beanName, mbd, instanceWrapper); //进行对象初始化操作(在这里可能生成代理对象) exposedObject = initializeBean(beanName, exposedObject, mbd); }}//createBeanInstance: 创建bean实例protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { //从bean定义中解析出当前bean的class对象 Class<?> beanClass = resolveBeanClass(mbd, beanName); //检测类的访问权限。默认情况下,对于非 public 的类,是允许访问的。若禁止访问,这里会抛出异常 if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Bean class isn't public, and non-public access not allowed: " + beanClass.getName()); } Supplier<?> instanceSupplier = mbd.getInstanceSupplier(); if (instanceSupplier != null) { return obtainFromSupplier(instanceSupplier, beanName); } //工厂方法,我们通过配置类来进行配置的话 采用的就是工厂方法 if (mbd.getFactoryMethodName() != null) { return instantiateUsingFactoryMethod(beanName, mbd, args); } //判断当前构造函数是否被解析过 boolean resolved = false; //有没有必须进行依赖注入 boolean autowireNecessary = false; if (args == null) { synchronized (mbd.constructorArgumentLock) { //判断我们的bean定义信息中的resolvedConstructorOrFactoryMethod(用来缓存我们的已经解析的构造函数或者工厂方法) if (mbd.resolvedConstructorOrFactoryMethod != null) { //修改已经解析过的构造函数的标志 resolved = true; //修改标记为ture 标识构造函数或者工厂方法已经解析过 autowireNecessary = mbd.constructorArgumentsResolved; } } } //若被解析过 if (resolved) { if (autowireNecessary) { //通过有参的构造函数进行反射调用 return autowireConstructor(beanName, mbd, null, null); } else { //调用无参数的构造函数进行创建对象 return instantiateBean(beanName, mbd); } } //通过bean的后置处理器选举出合适的构造函数创建对象 Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); //通过后置处理器解析出构造器对象不为null或获取bean定义中的注入模式是构造器注入或bean定义信息ConstructorArgumentValues或获取通过getBean的方式传入的构造器函数参数类型不为null if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { //通过构造函数创建对象 return autowireConstructor(beanName, mbd, ctors, args); } //使用无参数的构造函数调用创建对象 return instantiateBean(beanName, mbd);}//先从缓存中获取对象public Object getSingleton(String beanName) { return getSingleton(beanName, true);}//这里涉及到Spring的三级缓存,可以用它来解决循环依赖protected Object getSingleton(String beanName, boolean allowEarlyReference) { //第一步:我们先尝试去一级缓存(单例缓存池中去获取对象,一般情况从该map中获取的对象是直接可以使用的) //Spring IoC容器初始化加载单实例bean的时候第一次进来的时候 该map一般返回null Object singletonObject = this.singletonObjects.get(beanName); //若在第一级缓存中没有获取到对象,并且singletonsCurrentlyInCreation正在创建的单实例的list包 含该beanName //Spring IoC容器初始化加载单实例bean的时候第一次进来的时候 该list中一般返回null,但是循环依赖的 时候可以满足该条件 if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { //则尝试去二级缓存中获取对象(二级缓存中的对象是一个早期对象) //何为早期对象:就是bean刚刚调用了构造方法,还没给bean的属性进行赋值的对象就是早期对象 singletonObject = this.earlySingletonObjects.get(beanName); //二级缓存中也没有获取到对象,allowEarlyReference为true(参数是有上一个方法传递进来的 true) if (singletonObject == null && allowEarlyReference) { //则直接从三级缓存中获取ObjectFactory对象 这个对象就是用来解决循环依赖的关键所在 //在getBean的过程中,当bean调用了构造方法的时候,把早期对象包裹成一个 ObjectFactory暴露到三级缓存中 ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); //从三级缓存中获取到对象不为空 if (singletonFactory != null) { //在这里通过暴露的ObjectFactory包装对象中,通过调用他的getObject()来获取我 们的早期对象 //在这个环节中会调用到 getEarlyBeanReference()来进行后置处理 singletonObject = singletonFactory.getObject(); //把早期对象放置在二级缓存, this.earlySingletonObjects.put(beanName, singletonObject); //ObjectFactory 包装对象从三级缓存中删除掉 this.singletonFactories.remove(beanName); } } } } return singletonObject;}//此时已经完成了容器的刷新protected void finishRefresh() { //清理缓存 clearResourceCaches(); //初始化跟生命周期有关的后置处理器,默认从容器找是否有id为lifecycleProcessor的组件,如果没有,就 默认创建DefaultLifecycleProcessor initLifecycleProcessor(); //拿到生命周期处理器,然后回调onRefresh() getLifecycleProcessor().onRefresh(); //发布事件-->容器刷新完成事件 publishEvent(new ContextRefreshedEvent(this)); LiveBeansView.registerApplicationContext(this);}//初始化跟生命周期有关的后置处理器protected void initLifecycleProcessor() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); if (beanFactory.containsLocalBean(LIFECYCLE_PROCESSOR_BEAN_NAME)) { this.lifecycleProcessor = beanFactory.getBean(LIFECYCLE_PROCESSOR_BEAN_NAME, LifecycleProcessor.class); if (logger.isDebugEnabled()) { logger.debug("Using LifecycleProcessor [" + this.lifecycleProcessor + "]"); } } else { DefaultLifecycleProcessor defaultProcessor = new DefaultLifecycleProcessor(); defaultProcessor.setBeanFactory(beanFactory); this.lifecycleProcessor = defaultProcessor; beanFactory.registerSingleton(LIFECYCLE_PROCESSOR_BEAN_NAME, this.lifecycleProcessor); if (logger.isDebugEnabled()) { logger.debug("Unable to locate LifecycleProcessor with name '" + LIFECYCLE_PROCESSOR_BEAN_NAME + "': using default [" + this.lifecycleProcessor + "]"); } }}
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源码分析