zoukankan      html  css  js  c++  java
  • MybatisProperties注册IOC容器和初始化

    MybatisProperties的注册IOC容器

    将MybatisAutoConfiguration作为ConfigurationClass parse时,同之前@Import分析一样,然后会将MybatiesProperties注册到IOC容器

    @EnableConfigurationProperties(MybatisProperties.class)
    public class MybatisAutoConfiguration implements InitializingBean {
        ......
    }
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Import(EnableConfigurationPropertiesRegistrar.class)
    public @interface EnableConfigurationProperties {
        ......
    }
    
    MybatisProperties的初始化设置mapperLocations、typeAliasesPackage

    和前文《DataSource的注册容器和初始化》分析一样,在JavaBeanBinder#bind()中,bound便是要初始化赋的值

    private <T> boolean bind(BeanSupplier<T> beanSupplier, DataObjectPropertyBinder propertyBinder,
    		BeanProperty property) {
    	String propertyName = property.getName();
    	ResolvableType type = property.getType();
    	Supplier<Object> value = property.getValue(beanSupplier);
    	Annotation[] annotations = property.getAnnotations();
    	Object bound = propertyBinder.bindProperty(propertyName,
    			Bindable.of(type).withSuppliedValue(value).withAnnotations(annotations));
    	if (bound == null) {
    		return false;
    	}
    	if (property.isSettable()) {
    		property.setValue(beanSupplier, bound);
    	}
        ......	
    }
    

    而具体寻找property是Binder#findProperty()方法

    private ConfigurationProperty findProperty(ConfigurationPropertyName name, Context context) {
    	if (name.isEmpty()) {
    		return null;
    	}
    	for (ConfigurationPropertySource source : context.getSources()) {
    		ConfigurationProperty property = source.getConfigurationProperty(name);
    		if (property != null) {
    			return property;
    		}
    	}
    	return null;
    }
    

    而具体给属性赋值仍是在ConfigDataEnvironmentContributors#withProcessedImports()中

    ConfigDataEnvironmentContributors withProcessedImports(ConfigDataImporter importer,
    		ConfigDataActivationContext activationContext) {
    
    	while (true) {
            ConfigDataEnvironmentContributor contributorAndChildren = contributor.withChildren(importPhase,
    					asContributors(imported));
    	}
    }
    
    static ConfigDataEnvironmentContributor ofUnboundImport(ConfigDataResource resource, ConfigData configData,
    		int propertySourceIndex) {
    	PropertySource<?> propertySource = configData.getPropertySources().get(propertySourceIndex);
    	ConfigurationPropertySource configurationPropertySource = ConfigurationPropertySource.from(propertySource);
    	boolean ignoreImports = configData.getOptions().contains(ConfigData.Option.IGNORE_IMPORTS);
    	return new ConfigDataEnvironmentContributor(Kind.UNBOUND_IMPORT, resource, propertySource,
    			configurationPropertySource, null, ignoreImports, null);
    }
    

    最后在SpringConfigurationPropertySource#from()中对mapper进行赋值。

    static SpringConfigurationPropertySource from(PropertySource<?> source) {
    	Assert.notNull(source, "Source must not be null");
    	PropertyMapper[] mappers = getPropertyMappers(source);
    	if (isFullEnumerable(source)) {
    		return new SpringIterableConfigurationPropertySource((EnumerablePropertySource<?>) source, mappers);
    	}
    	return new SpringConfigurationPropertySource(source, mappers);
    }
    

    而具体值解析则是从ConfigDataImporter#resolveAndLoad()入口,最后则是通过具体的YamlPropertySourceLoader从yaml文件获得配置值

    Map<ConfigDataResource, ConfigData> resolveAndLoad(ConfigDataActivationContext activationContext,
    		ConfigDataLocationResolverContext locationResolverContext, ConfigDataLoaderContext loaderContext,
    		List<ConfigDataLocation> locations) {
    	try {
    		Profiles profiles = (activationContext != null) ? activationContext.getProfiles() : null;
    		List<ConfigDataResolutionResult> resolved = resolve(locationResolverContext, profiles, locations);
    		return load(loaderContext, resolved);
    	}
    	catch (IOException ex) {
    		throw new IllegalStateException("IO error on loading imports from " + locations, ex);
    	}
    }
    

    YamlPropertySourceLoader#load()

    @Override
    public List<PropertySource<?>> load(String name, Resource resource) throws IOException {
    	if (!ClassUtils.isPresent("org.yaml.snakeyaml.Yaml", null)) {
    		throw new IllegalStateException(
    				"Attempted to load " + name + " but snakeyaml was not found on the classpath");
    	}
    	List<Map<String, Object>> loaded = new OriginTrackedYamlLoader(resource).load();
    	if (loaded.isEmpty()) {
    		return Collections.emptyList();
    	}
    	List<PropertySource<?>> propertySources = new ArrayList<>(loaded.size());
    	for (int i = 0; i < loaded.size(); i++) {
    		String documentNumber = (loaded.size() != 1) ? " (document #" + i + ")" : "";
    		propertySources.add(new OriginTrackedMapPropertySource(name + documentNumber,
    				Collections.unmodifiableMap(loaded.get(i)), true));
    	}
    	return propertySources;
    }
    

    调用链:

    "main@1" prio=5 tid=0x1 nid=NA runnable
      java.lang.Thread.State: RUNNABLE
    	  at org.mybatis.spring.boot.autoconfigure.MybatisProperties.setMapperLocations(MybatisProperties.java:118)
    	  at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java:-1)
    	  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    	  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	  at java.lang.reflect.Method.invoke(Method.java:498)
    	  at org.springframework.boot.context.properties.bind.JavaBeanBinder$BeanProperty.setValue(JavaBeanBinder.java:354)
    	  at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:98)
    	  at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:80)
    	  at org.springframework.boot.context.properties.bind.JavaBeanBinder.bind(JavaBeanBinder.java:56)
    	  at org.springframework.boot.context.properties.bind.Binder.lambda$bindDataObject$5(Binder.java:451)
    	  at org.springframework.boot.context.properties.bind.Binder$$Lambda$67.1770437551.get(Unknown Source:-1)
    	  at org.springframework.boot.context.properties.bind.Binder$Context.withIncreasedDepth(Binder.java:571)
    	  at org.springframework.boot.context.properties.bind.Binder$Context.withDataObject(Binder.java:557)
    	  at org.springframework.boot.context.properties.bind.Binder$Context.access$300(Binder.java:512)
    	  at org.springframework.boot.context.properties.bind.Binder.bindDataObject(Binder.java:449)
    	  at org.springframework.boot.context.properties.bind.Binder.bindObject(Binder.java:390)
    	  at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:319)
    	  at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:308)
    	  at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:238)
    	  at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:225)
    	  at org.springframework.boot.context.properties.ConfigurationPropertiesBinder.bind(ConfigurationPropertiesBinder.java:91)
    	  at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.bind(ConfigurationPropertiesBindingPostProcessor.java:89)
    	  at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:78)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:429)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1780)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:609)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$208.1624788833.getObject(Unknown Source:-1)
    	  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    	  - locked <0x15af> (a java.util.concurrent.ConcurrentHashMap)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    	  at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1367)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287)
    	  at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:885)
    	  at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789)
    	  at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:228)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1356)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1206)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$208.1624788833.getObject(Unknown Source:-1)
    	  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    	  at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:409)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1179)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$208.1624788833.getObject(Unknown Source:-1)
    	  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    	  at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1367)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1503)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1401)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$208.1624788833.getObject(Unknown Source:-1)
    	  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    	  at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1367)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287)
    	  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
    	  at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
    	  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$208.1624788833.getObject(Unknown Source:-1)
    	  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    	  at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1367)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1287)
    	  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640)
    	  at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
    	  at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
    	  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$208.1624788833.getObject(Unknown Source:-1)
    	  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
    	  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
    	  at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
    	  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
    	  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588)
    	  - locked <0x15b0> (a java.lang.Object)
    	  at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
    	  at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)
    	  at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    	  at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426)
    	  at org.springframework.boot.SpringApplication.run(SpringApplication.java:326)
    	  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309)
    	  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298)
    	  at com.java.study.StudyApplication.main(StudyApplication.java:13)
    
    

    application.yaml值加载调用链

    "main@1" prio=5 tid=0x1 nid=NA runnable
      java.lang.Thread.State: RUNNABLE
    	  at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:60)
    	  at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:45)
    	  at org.springframework.boot.context.config.StandardConfigDataLoader.load(StandardConfigDataLoader.java:34)
    	  at org.springframework.boot.context.config.ConfigDataLoaders.load(ConfigDataLoaders.java:102)
    	  at org.springframework.boot.context.config.ConfigDataImporter.load(ConfigDataImporter.java:118)
    	  at org.springframework.boot.context.config.ConfigDataImporter.resolveAndLoad(ConfigDataImporter.java:82)
    	  at org.springframework.boot.context.config.ConfigDataEnvironmentContributors.withProcessedImports(ConfigDataEnvironmentContributors.java:118)
    	  at org.springframework.boot.context.config.ConfigDataEnvironment.processInitial(ConfigDataEnvironment.java:230)
    	  at org.springframework.boot.context.config.ConfigDataEnvironment.processAndApply(ConfigDataEnvironment.java:217)
    	  at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:88)
    	  at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:80)
    	  at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:100)
    	  at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:86)
    	  at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:203)
    	  at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:196)
    	  at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:170)
    	  at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:148)
    	  at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:82)
    	  at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:63)
    	  at org.springframework.boot.SpringApplicationRunListeners$$Lambda$41.586358252.accept(Unknown Source:-1)
    	  at java.util.ArrayList.forEach(ArrayList.java:1257)
    	  at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:117)
    	  at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:111)
    	  at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:62)
    	  at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:362)
    	  at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
    	  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309)
    	  at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298)
    	  at com.java.study.StudyApplication.main(StudyApplication.java:13)
    
    
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出。
  • 相关阅读:
    9.5(day3)
    9.4(day2)
    web第一阶段 9.3(day1)
    8.29
    8.28
    8.27
    8.24
    dockerfile的编写
    深入解析pod对象的基本概念
    k8s最小调度pod的概念
  • 原文地址:https://www.cnblogs.com/caozibiao/p/14039358.html
Copyright © 2011-2022 走看看