Stringboot自动配置原理

Stringboot自动配置原理(面试回答)

本文摘自圣斗士Morty博客https://me.csdn.net/u014745069)https://blog.csdn.net/u014745069/article/details/83820511。

Springboot的启动类上有一个**@SpringBootApplication注解,它是一个派生注解,在它内部有一个@EnableAutoConfiguration**,翻译叫做开启自动配置。这个注解也是一个派生注解,其中关键的功能由**@Import提供。@Import注解导入的AutoConfigurationImportSelector.class类中有一个方法叫selectImports()。该方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表。这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(…)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。当然并不是所有的自动配置类都会被加载。如果在自动配置类上有条件判断的@Conditional**,需要先满足@Conditional的条件。常见的条件注解有:

@ConditionalOnBean:当容器里有指定的bean的条件下。

@ConditionalOnMissingBean:当容器里不存在指定bean的条件下。

@ConditionalOnClass:当类路径下有指定类的条件下。

@ConditionalOnMissingClass:当类路径下不存在指定类的条件下。

@ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true

全局配置的属性如何生效呢?比如:server.port=8081。

ServletWebServerFactoryAutoConfiguration类上,有一个**@EnableConfigurationProperties**注解:开启配置属性,而它后面的参数是一个ServerProperties类,这就是习惯优于配置的最终落地点。

img

在这个类上,我们看到了一个非常熟悉的注解:@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上。

简略回答:通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。

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