zoukankan      html  css  js  c++  java
  • SpringBoot-自动配置

    主配置类

    @SpringBootApplication
    public class SpringBootDruidApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(SpringBootAutoConfigApplication.class, args);
    	}
    }
    

    @SpringBootApplication注解

    package org.springframework.boot.autoconfigure;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.boot.SpringBootConfiguration;
    import org.springframework.boot.context.TypeExcludeFilter;
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.FilterType;
    import org.springframework.context.annotation.ComponentScan.Filter;
    import org.springframework.core.annotation.AliasFor;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(
        excludeFilters = {@Filter(
        type = FilterType.CUSTOM,
        classes = {TypeExcludeFilter.class}
    ), @Filter(
        type = FilterType.CUSTOM,
        classes = {AutoConfigurationExcludeFilter.class}
    )}
    )
    public @interface SpringBootApplication {
        @AliasFor(
            annotation = EnableAutoConfiguration.class
        )
        Class<?>[] exclude() default {};
    
        @AliasFor(
            annotation = EnableAutoConfiguration.class
        )
        String[] excludeName() default {};
    
        @AliasFor(
            annotation = ComponentScan.class,
            attribute = "basePackages"
        )
        String[] scanBasePackages() default {};
    
        @AliasFor(
            annotation = ComponentScan.class,
            attribute = "basePackageClasses"
        )
        Class<?>[] scanBasePackageClasses() default {};
    
        @AliasFor(
            annotation = Configuration.class
        )
        boolean proxyBeanMethods() default true;
    }
    

    @EnableAutoConfiguration注解

    package org.springframework.boot.autoconfigure;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.context.annotation.Import;
    
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import({AutoConfigurationImportSelector.class})
    public @interface EnableAutoConfiguration {
        String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
    
        Class<?>[] exclude() default {};
    
        String[] excludeName() default {};
    }
    

    AutoConfigurationImportSelector  

      将自动配置类注入到IOC容器中

    protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
    	if (!this.isEnabled(annotationMetadata)) {
    		return EMPTY_ENTRY;
    	} else {
    		AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
    		// 从META-INF/spring.factories文件中获得所有的"org.springframework.boot.autoconfigure.EnableAutoConfiguration"对应的值
    		List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
    		configurations = this.removeDuplicates(configurations);
    		Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
    		this.checkExcludedClasses(configurations, exclusions);
    		configurations.removeAll(exclusions);
    		configurations = this.filter(configurations, autoConfigurationMetadata);
    		this.fireAutoConfigurationImportEvents(configurations, exclusions);
    		return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    	}
    }
    
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    	List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    	Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
    	return configurations;
    }
    

      

      

  • 相关阅读:
    ORA12560: TNS: 协议适配器错误
    eclipse无法识别Web项目的问题
    搭建eclipse+tomcat开发环境
    初探弹出层的实现原理
    样式可控的左右选择组件
    在TSQL中用队列来遍历层级数据
    复利计算工具 wpf
    浏览WPF中内置颜色名对应的颜色
    原创:通过VS 2010+SVN为SQL Server提供数据库版本管理
    原创:学习英语小助手(阅读粘贴的英文,使用MVVM)
  • 原文地址:https://www.cnblogs.com/BINGJJFLY/p/12035432.html
Copyright © 2011-2022 走看看