摘要:一源码分析简述声明本人使用的开发工具为了解查看源码,眼睛扫到,这很关键。注版本是,该类继承了。这说明了依赖于配置文件,文件中键为对应的配置项注全类名加载到容器。如果用方法获得,会报错,所以呀用的方法。
一、源码分析简述
声明:本人使用的开发工具为IDEA
1、@EnableAutoConfiguration了解
查看源码,眼睛扫到@Import(AutoConfigurationImportSelector.class),这很关键。注版本1.5是EnableAutoConfigurationImportSelector,该类继承了AutoConfigurationImportSelector。
2、再查看源码AutoConfigurationImportSelector.java,里面用到了方法getCandidateConfigurations()
然后按住Ctrl点进去,查看方法getCandidateConfigurations(),了解他会到classpath下的读取META-INF/spring.factories文件的配置,并返回一个字符串数组。这说明了@EnableAutoConfiguration-- 依赖于META-INF/spring.factories配置文件,spring.factories文件中键key为 org.springframework.boot.autoconfigure.EnableAutoConfiguration ,对应的配置项(注:全类名)加载到spring容器。
前提:只有spring.boot.enableautoconfiguration为true(默认为true)的时候,才启用自动配置
该注解@EnableAutoConfiguration还可以进行排除,排除方式有2中,一是根据classes来排除(exclude),二是根据class names(excludeName)来排除
其内部实现的核心关键点有二
1)ImportSelector 该接口的方法的返回值都会被纳入到spring 的容器管理 2)SpringFactoriesLoader 该类可以从classpath中搜索META-INF/spring.factories配置文件,并读取配置
二、详细步骤
1、创建两个maven Module ,当然你也可以创建一个pom文件主要代码如下
1)springboot3的maven module 的POM文件UTF-8 1.8 1.8 4.12 org.springframework.boot spring-boot-dependencies 1.5.10.RELEASE import pom 2)springboot3-core-bean的maven module 的POM文件 org.springframework.boot spring-boot-starter com.fai springboot03-core-bean 1.0-SNAPSHOT junit junit ${junit.version} com.fai springboot03-core-bean 1.0-SNAPSHOT UTF-8 1.8 1.8 4.12 org.springframework spring-context 4.3.12.RELEASE junit junit ${junit.version}
2、创建类
1)Car.java public class Car {} 2)CarConfiguration.java @Configuration public class CarConfiguration { @Bean public Car getCar() { return new Car(); } } 3)Music.java public class Music {} 4)RunnableConfiguration.java /** * Runnable配置类 */ @Configuration public class RunnableConfiguration { @Bean public Runnable getRunnable1() { return () -> {}; } } 5)META-INF/spring.factories #查看@EnableAutoConfiguration 注解源码,--"spring.boot.enableautoconfiguration"; #默认true . 如果改成false,EnableAutoConfiguration注解不起作用 spring.boot.enableautoconfiguration=true 6)测试 @EnableAutoConfiguration // 根据应用所声明的依赖来对Spring框架进行自动配置 // 根据class排除 //@EnableAutoConfiguration(exclude = {CarConfiguration.class,Music.class}) // 根据class names排除,全类名 //@EnableAutoConfiguration(excludeName = {"com.fai.bean.RunnableConfiguration"}) @ComponentScan public class App { public static void main(String[] args) { SpringApplication app = new SpringApplication(App.class); ConfigurableApplicationContext context = app.run(args); // 获取Runnable 类对象的实例 // System.out.println(context.getBean(Runnable.class)); System.out.println(context.getBeansOfType(Runnable.class)); // 获取Car 类的Bean System.out.println(context.getBeansOfType(Car.class)); // 获取Music 类的Bean System.out.println(context.getBeansOfType(Music.class)); context.close(); } } 7)在测试中,更改配置文件application.properties中的spring.boot.enableautoconfiguration的值为false后,获取不到Bean #查看@EnableAutoConfiguration 注解源码,"spring.boot.enableautoconfiguration"; #默认true,如果改成false,EnableAutoConfiguration注解不起作用 spring.boot.enableautoconfiguration=false
在第7)的改为false测试结果如下图,是空的。如果用getBean方法获得Bean,会报错,所以呀用的getBeansOfType方法。
三、附上关键源码
1、@EnableAutoConfiguration 注解
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class) // 1.5版本,我用的
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 {};
}
2、EnableAutoConfigurationImportSelector 源码
@Deprecated
public class EnableAutoConfigurationImportSelector
extends AutoConfigurationImportSelector { @Override protected boolean isEnabled(AnnotationMetadata metadata) { if (getClass().equals(EnableAutoConfigurationImportSelector.class)) { return getEnvironment().getProperty( EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class, true); } return true; }
}
3、EnableAutoConfigurationImportSelector 的父类AutoConfigurationImportSelector 源码关键方法摘要
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) { if (!isEnabled(annotationMetadata)) { // 配置文件中的默认配置为true,我改过false的那个 return NO_IMPORTS; } try { AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader .loadMetadata(this.beanClassLoader); AnnotationAttributes attributes = getAttributes(annotationMetadata); Listconfigurations = getCandidateConfigurations(annotationMetadata, attributes); configurations = removeDuplicates(configurations); configurations = sort(configurations, autoConfigurationMetadata); Set 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); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71022.html
摘要:所以,所谓的自动装配,实际上就是如何自动将装载到容器中来。实际上在版本中,模块驱动注解的出现,已经有了一定的自动装配的雏形,而真正能够实现这一机制,还是在版本中,条件注解的出现。,我们来看一下的自动装配是怎么一回事。在前面的分析中,Spring Framework一直在致力于解决一个问题,就是如何让bean的管理变得更简单,如何让开发者尽可能的少关注一些基础化的bean的配置,从而实现自动装...
摘要:启动原理和执行原理分析一的启动原理我们打开,注意看下面两个依赖我们第一步是继承了父项目,然后在添加启动器的依赖,项目就会自动给我们导入关于项目所需要的配置和。 上一篇我们看到,我们很轻松的完成了项目的构建,那么SpringBoot是如何做到的呢,在使用的使用又有哪些通用配置和注意事项呢? 其实SpringBoot给我们做了大量的自动配置功能,我们只需要引入对应的启动器就可以直接使用,作...
摘要:前言用过的肯定很熟悉,它其中有个重要的特性,就是自动配置平时习惯的一些设置的配置作为默认配置。提倡无配置文件的理念,使用生成的应用完全不会生成任何配置代码与配置文件。 前言 用过springboot的肯定很熟悉,它其中有个重要的特性,就是自动配置(平时习惯的一些设置的配置作为默认配置)。springboot提倡无XML配置文件的理念,使用springboot生成的应用完全不会生成任何配...
摘要:常规的配置让开发人员将更多的经历耗费在了配置文件上。其中有三个注解,,。以前我们需要配置的东西,帮我们自动配置,告诉开启自动配置功能,这样自动配置才能生效。 为什么需要自动化配置 在常规的spring应用程序中,充斥着大量的配置文件,我们需要手动去配置这些文件,如配置组件扫描、视图解析器、http编码等等。常规的配置让开发人员将更多的经历耗费在了配置文件上。而这些配置都是一些固定模...
摘要:常规的配置让开发人员将更多的经历耗费在了配置文件上。其中有三个注解,,。以前我们需要配置的东西,帮我们自动配置,告诉开启自动配置功能,这样自动配置才能生效。 为什么需要自动化配置 在常规的spring应用程序中,充斥着大量的配置文件,我们需要手动去配置这些文件,如配置组件扫描、视图解析器、http编码等等。常规的配置让开发人员将更多的经历耗费在了配置文件上。而这些配置都是一些固定模...
阅读 2327·2021-09-22 15:15
阅读 609·2021-09-02 15:11
阅读 1749·2021-08-30 09:48
阅读 1832·2019-08-30 15:56
阅读 1424·2019-08-30 15:52
阅读 2003·2019-08-30 15:44
阅读 400·2019-08-29 16:29
阅读 1511·2019-08-29 11:06