• Spring源码之事务(一)— TransactionAutoConfiguration自动配置


    总结:

    • 在ConfigurationClassParser#parse()中会对deferredImportSelectorHandler进行处理(在处理@ComponentScan 自己所写@Component的类后)
    • 处理过程中会调用SpringFactoriesLoader#loadFactoryNames(),去查找所有jar下面META-INF/spring.factories中key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的值
    • ConfigurationClassPostProcessor#processConfigBeanDefinitions()中loadBeanDefinitions对TransactionAutoConfiguration进行BeanDefinition的加载,并注册IOC容器

    TransactionAutoConfiguration的BeanDefinition加载解析

    调用链:

    AbstractApplicationContext#refresh() --> AbstractApplicationContext#invokeBeanFactoryPostProcessors() --> PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors() --> PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors() --> ConfigurationClassPostProcessor#postProcessBeanDefinitionRegistry()--> ConfigurationClassPostProcessor#processConfigBeanDefinitions() --> ConfigurationClassPostProcessor#parse() --> ConfigurationClassParser#process() --> ConfigurationClassParser$DeferredImportSelectorGroupingHandler#processGroupImports() --> ConfigurationClassParser#processImports() --> ConfigurationClassParser#processConfigurationClass() --> ConfigurationClassParser#doProcessConfigurationClass()

    ConfigurationClassParser#parse() 对延迟ImportSelector进行处理

    private final DeferredImportSelectorHandler deferredImportSelectorHandler = new DeferredImportSelectorHandler();
    
    public void parse(Set<BeanDefinitionHolder> configCandidates) {
    	this.deferredImportSelectorHandler.process();
    }
    
    

    调用DeferredImportSelectorGroupingHandler#processGroupImports()

    public void process() {
    	List<DeferredImportSelectorHolder> deferredImports = this.deferredImportSelectors;
    	this.deferredImportSelectors = null;
    	try {
    		if (deferredImports != null) {
    			DeferredImportSelectorGroupingHandler handler = new DeferredImportSelectorGroupingHandler();
    			deferredImports.sort(DEFERRED_IMPORT_COMPARATOR);
    			// 给ConfigurationClassParser.groupings赋值
    			deferredImports.forEach(handler::register);
    			// DeferredImportSelectorGroupingHandler处理
    			handler.processGroupImports();
    		}
    	}
    	finally {
    		this.deferredImportSelectors = new ArrayList<>();
    	}
    

    主要handler.processGroupImports()中 grouping.getImports()会查找出所有ConfigurationClassParser$DeferredImportSelectorGroupingHandler中的imports

    public void processGroupImports() {
    	for (DeferredImportSelectorGrouping grouping : this.groupings.values()) {
    		
    		grouping.getImports().forEach(entry -> {
    			ConfigurationClass configurationClass = this.configurationClasses.get(entry.getMetadata());
    			try {
    				processImports(configurationClass, asSourceClass(configurationClass, exclusionFilter),
    						Collections.singleton(asSourceClass(entry.getImportClassName(), exclusionFilter)),
    						exclusionFilter, false);
    			}
    		}
    	}
    }
    

    ConfigurationClassParser$DeferredImportSelectorGroupingHandler#getImports()

    public Iterable<Group.Entry> getImports() {
    	for (DeferredImportSelectorHolder deferredImport : this.deferredImports) {
    		this.group.process(deferredImport.getConfigurationClass().getMetadata(),
    				deferredImport.getImportSelector());
    	}
    	return this.group.selectImports();
    }
    

    会调用AutoConfigurationImportSelector#process()

    public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector) {
    	AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector) deferredImportSelector)
    			.getAutoConfigurationEntry(annotationMetadata);
    	this.autoConfigurationEntries.add(autoConfigurationEntry);
    	for (String importClassName : autoConfigurationEntry.getConfigurations()) {
    		this.entries.putIfAbsent(importClassName, annotationMetadata);
    	}
    }
    

    会调用AutoConfigurationImportSelector#getAutoConfigurationEntry()

    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    	List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
    	......
    	return new AutoConfigurationEntry(configurations, exclusions);
    }
    

    其中AutoConfigurationImportSelector#getCandidateConfigurations()会查找所有jar下面META-INF/spring.factories,进行loadFactoryNames。

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    	List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
    			getBeanClassLoader());
    	return configurations;
    }
    

    SpringFactoriesLoader#loadFactoryNames()

    public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    	......
    	return loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
    }
    

    SpringFactoriesLoader#loadSpringFactories()

    private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
    
    	result = new HashMap<>();
    	try {
    		Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
    		while (urls.hasMoreElements()) {
    			URL url = urls.nextElement();
    			UrlResource resource = new UrlResource(url);
    			Properties properties = PropertiesLoaderUtils.loadProperties(resource);
    			for (Map.Entry<?, ?> entry : properties.entrySet()) {
    				String factoryTypeName = ((String) entry.getKey()).trim();
    				String[] factoryImplementationNames =
    						StringUtils.commaDelimitedListToStringArray((String) entry.getValue());
    				for (String factoryImplementationName : factoryImplementationNames) {
    					result.computeIfAbsent(factoryTypeName, key -> new ArrayList<>())
    							.add(factoryImplementationName.trim());
    				}
    			}
    		}
    	}
    	
    	return result;
    }
    

    其中spring-boot-autoconfigure-XX.jar下面META-INF/spring.factories文件中就有:

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
    

    附:其中ConfigurationClassParser.groupings赋值,是在ConfigurationClassParser#register()执行的

    public void register(DeferredImportSelectorHolder deferredImport) {
    	Class<? extends Group> group = deferredImport.getImportSelector().getImportGroup();
    	DeferredImportSelectorGrouping grouping = this.groupings.computeIfAbsent(
    			(group != null ? group : deferredImport),
    			key -> new DeferredImportSelectorGrouping(createGroup(group)));
    	grouping.add(deferredImport);
    	this.configurationClasses.put(deferredImport.getConfigurationClass().getMetadata(),
    			deferredImport.getConfigurationClass());
    }
    

    loadBeanDefinitions

    this.reader.loadBeanDefinitions(configClasses)进行BeanDefinition的加载,并注册到IOC容器

    public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
        this.reader.loadBeanDefinitions(configClasses);
    }
    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出。
  • 相关阅读:
    vue 组件的封装
    原生tab选项卡
    vue 登录验证码
    input type=”file“ change事件只执行一次的问题
    Java容器解析系列(13) WeakHashMap详解
    Java容器解析系列(12) LinkedHashMap 详解
    Java容器解析系列(11) HashMap 详解
    Java泛型之自限定类型
    java Reference
    Thread类源码解析
  • 原文地址:https://www.cnblogs.com/caozibiao/p/14006052.html
Copyright © 2020-2023  润新知