Springboot自动装配原理详解

Springboot自动装配原理

主程序类,主入口类
@SpringBootApplication
public class MysteelEnglishWebApplication {

    public static void main(String[] args) {
        SpringApplication.run(MysteelEnglishWebApplication.class, args);
    }

}

@SpringBootApplication: Springboot应用标注在某个类上说明这个类是springboot的主配置类,springboot就是运用这个类的main方法来启动springboot应用。

@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 {}

@SpringBootConfiguration:Springboot的配置类,标注在某个类上,表示这是一个SpringBoot的配置类;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}

@Configuration:spring配置类,相当于xml中的

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
	String value() default "";
}

@Component: spring组件,自身交给spring IOC容器托管,相当于

@EnableAutoConfiguration:开启自动装配功能

以前我们需要配置的东西,现在Springboot帮我们自动配置:@EnableAutoConfiguration告诉springboot开启自动装配功能。

@EnableAutoConfiguration
------------------->

@Import(EnableAutoConfigurationImportSelector.class)

@AutoConfigurationPackage
——————----->
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}

@AutoConfigurationPackage:自动配置包路径

@AutoConfigurationPackage注解的功能是由@Import注解实现的,它是spring框架的底层注解,它的作用就是给容器中导入某个组件类,例如@Import(AutoConfigurationPackages.Registrar.class),它就是将Registrar这个组件类导入到容器中,可查看Registrar类中registerBeanDefinitions方法,这个方法就是导入组件类的具体实现 :

Springboot自动装配原理详解_第1张图片

@AutoConfigurationPackage注解的主要作用就是将主程序类所在包及所有子包下的组件到扫描到spring容器中。

@Import(EnableAutoConfigurationImportSelector.class)

@Import(EnableAutoConfigurationImportSelector.class): 给容器导入组件

AutoConfigurationImportSelector:导入哪些组件的选择器;

将所有需要导入的组件以全类名的方式返回;这些组件会被添加其中

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

有了自动配置类,免去了我们手动编写配置注入功能组等的工作
Springboot自动装配原理详解_第2张图片

List<String> configurations = getCandidateConfigurations(annotationMetadata,
      attributes);
//通过该方法获取所有配置

SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,beanClassLoader)(loadFactoryNames)方法,用类加载器获取配置资源

获取springboot-auto-configuration.jar下的的META-INF/spring.factories资源

结论:SpringBoot不需要写配置文件的原因是,SpringBoot所有配置都是在启动的时候进行扫描并加载,Springboot的自动配置类都在spring.factories里面,但是不一定生效,生效前需要判断条件是否成立(通过@ConditionalOnClass,@ConditionalOnMissingBean,@ConditionalOnProperty进行判断),只需要导入对应的start的jar包,就有了对应的启动器,有了启动器就能帮我们自动装配了。

依赖图

Spring的自动装配原理Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,通过@Bean导入到Spring容器中,以Properties结尾命名的类是和配置文件进行绑定的。它能通过这些以Properties结尾命名的类中取得在全局配置文件中配置的属性,我们可以通过修改配置文件对应的属性来修改自动配置的默认值,来完成自定义配置

启动类的@SpringBootApplication注解由@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan三个注解组成,三个注解共同完成自动装配;

  • @SpringBootConfiguration 注解标记启动类为配置类
  • @ComponentScan 注解实现启动时扫描启动类所在的包以及子包下所有标记为bean的类由IOC容器注册为bean
  • @EnableAutoConfiguration通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过AutoConfigurationImportSelector 类的 selectImports 方法去读取需要被自动装配的组件依赖下的spring.factories文件配置的组件的类全名,并按照一定的规则过滤掉不符合要求的组件的类全名,将剩余读取到的各个组件的类全名集合返回给IOC容器并将这些组件注册为bean
约定大于配置

在SpringBoot中,约定大于配置可以从以下两个方面来理解:

  • 开发人员仅需规定应用中不符合约定的部分

  • 在没有规定配置的地方,采用默认配置,以力求最简配置为核心思想总的来说,上面两条都遵循了推荐默认配置的思想。当存在特殊需求的时候,自定义配置即可。这样可以大大的减少配置工作,这就是所谓的“约定”。

详情看这

你可能感兴趣的:(spring,boot,java,spring)