SpringBoot配置篇------自动配置

以前我们开发一个SSM项目,需要利用配置文件进行相关配置,而SpingBoot利用了配置类进行自动配置,这里配置类等同于配置文件,SpringBoot并且开启了自动配置,以前我们需要手动配置的东西,这里SpringBoot帮我们进行了自动配置

PS: 自动配置原理后面会说到,这个原理也是SpringBoot的精髓所在

package com.staticzz.springboot_quick;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
@SpringBootApplication注解标注在某一个类上,
就说明这个类为SpringBoot应用的主程序类
SpringBoot就应该运行这个类的main方法来启动Springboot应用
**/
@SpringBootApplication
public class SpringbootQuickApplication {
     

    public static void main(String[] args) {
     

        SpringApplication.run(SpringbootQuickApplication.class, args);
    }
}

@SpringBootApplication 这个注解与自动配置又有什么关系呢?
接下来我们Ctrl+左键,进入到这个注解中来查看 @SpringBootApplication 这个注解里到底配置了什么?

动图演示:

SpringBoot配置篇------自动配置_第1张图片
我们观察到 @SpringBootApplication注解 继承了 @SpringBootConfiguration注解 ,而 @SpringBootConfiguration注解 又继承了Spring底层的注解 @Configuration注解 , 凡是标注该注解的类都是配置类

那现在也只是知道了 @SpringBootApplication注解 一层一层的实现了Spring底层的 @Configuration注解 ,被标注后称为配置类!那说了这篇文章讲的是SpringBoot的自动配置?配置有了,自动呢?

SpringBoot配置篇------自动配置_第2张图片

我没有骗人哦!确实是有自动配置的!而且SpringBoot也确确实实帮我们做了自动配置
SpringBoot配置篇------自动配置_第3张图片

来来来,先上一张动态演示图,瞧瞧

SpringBoot配置篇------自动配置_第4张图片
第一步 ctrl+右键 进入了 @EnableAutoConfiguration 这个注解

@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
     

	String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

	/**
	 * Exclude specific auto-configuration classes such that they will never be applied.
	 * @return the classes to exclude
	 */
	Class<?>[] exclude() default {
     };

	/**
	 * Exclude specific auto-configuration class names such that they will never be
	 * applied.
	 * @return the class names to exclude
	 * @since 1.3.0
	 */
	String[] excludeName() default {
     };

}

有没有发现我在这动态演示中,重点高亮了两个注解
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
这两个注解分别是什么意思 废话不多说 下面看!

@AutoConfigurationPackage 自动扫描包

@Import(EnableAutoConfigurationImportSelector.class) 导入自动配置类选择器组件

来看源码分析
@AutoConfigurationPackage
动态展示 自动扫描包

	/**
	 * {@link ImportBeanDefinitionRegistrar} to store the base package from the importing
	 * configuration.
	 */
	@Order(Ordered.HIGHEST_PRECEDENCE)
	static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
     

		@Override
		public void registerBeanDefinitions(AnnotationMetadata metadata,
				BeanDefinitionRegistry registry) {
     
			register(registry, new PackageImport(metadata).getPackageName());
		}

		@Override
		public Set<Object> determineImports(AnnotationMetadata metadata) {
     
			return Collections.<Object>singleton(new PackageImport(metadata));
		}

	}

结论: SpringBoot在启动时,会自动扫描主程序类所在的包下的所有子包


来看源码分析
@Import(EnableAutoConfigurationImportSelector.class)
动态展示 导入自动配置类选择器组件


@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
     
		if (!isEnabled(annotationMetadata)) {
     
			return NO_IMPORTS;
		}
		try {
     
			AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
					.loadMetadata(this.beanClassLoader);
			AnnotationAttributes attributes = getAttributes(annotationMetadata);
			List<String> configurations = getCandidateConfigurations(annotationMetadata,
					attributes);
			configurations = removeDuplicates(configurations);
			configurations = sort(configurations, autoConfigurationMetadata);
			Set<String> exclusions = getExclusions(annotationMetadata, attributes);
			checkExcludedClasses(configurations, exclusions);
			configurations.removeAll(exclusions);
			configurations = filter(configurations, autoConfigurationMetadata);
			fireAutoConfigurationImportEvents(configurations, exclusions);
			return configurations.toArray(new String[configurations.size()]);
		}
		catch (IOException ex) {
     
			throw new IllegalStateException(ex);
		}
	}

@Import(EnableAutoConfigurationImportSelector.class) 这个注解的作用把所有的自动配置类选择并扫描进容器中,

总结: SpringBoot给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器中导入场景所需要的所有组件并配置好这些组件

你可能感兴趣的:(spring,boot,boot,java,经验分享)