欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 前端技术 > javascript >内容正文

javascript

Spring Boot自动配置原理

发布时间:2025/4/16 javascript 27 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Spring Boot自动配置原理 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中。

首先我们需要有一个组件,这个组件中的属性将会承载我们在Properties配置文件中写出的内容。比如:

public class PersonProperties {private String lastName;private Integer age;private Boolean boss; }

spring boot提供了两个注解@PropertySource()和@ConfigurationProperties;这两个注解的意思分别是指定配置文件的位置和从配置文件中获取值。具体可以看下面这个示例:

person.properties文件内容:

person.lastName = hello person.age = 11 person.boss = false @PropertySource(value = {"classpath:person.properties"}) @Component @ConfigurationProperties(prefix = "person") public class PersonProperties {private String lastName;private Integer age;private Boolean boss;public void setLastName(String lastName) {this.lastName = lastName;}public void setAge(Integer age) {this.age = age;}public void setBoss(Boolean boss) {this.boss = boss;}@Overridepublic String toString() {return "Person{" +"lastName='" + lastName + '\'' +", age=" + age +", boss=" + boss +'}';} }

注意:@Component的加入是因为只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能,你也可以先不用,后面再使用@EnableConfigurationProperties注解来使@ConfigurationProperties生效,也就是注入数据并加入容器。在后面自动配置中用的就是这种用法;并且在注入属性的组件当中一定要写set方法,否则配置文件的属性无法注入;目前@PropertySource只能支持properties配置文件

按照道理来说,这个时候我们已经可以在项目中使用PersonProperties中的属性了,但是Spring Boot中还是使用了配置类来将这些属性再一次的封装到具体的类中,比如获取从容器中获取的PersonProperties类中的属性,将其赋给Person类,然后将Person也放到容器中。Spring Boot使用的是类似下面的这种操作(主要看注解和注释)

@Configuration public class MyAppConfig {//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名@Beanpublic HelloService helloService02(){System.out.println("配置类@Bean给容器中添加组件了...");return new HelloService();} }

了解了这两种方式之后,我们就可以分析Spring Boot自动配置的原理了。

首先在@SpringBootApplication中我们使用了@EnableAutoConfiguration;

@EnableAutoConfiguration 会扫描所有jar包类路径下 META‐INF/spring.factories,然后把扫描到的这些文件的内容包装成properties对象从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中,也即是类似下面的这些类加入到容器中(只是部分):

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\ org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\ org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\ org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\ org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\ org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\ ...

我们以其中的HttpEncodingAutoConfiguration为例:

@Configuration //表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件 @EnableConfigurationProperties(HttpEncodingProperties.class) //启动指定类的ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把HttpEncodingProperties加入到ioc容器中 @ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,当前配置类生效 @ConditionalOnClass(CharacterEncodingFilter.class) //判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器; @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) //判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;public class HttpEncodingAutoConfiguration {//他已经和SpringBoot的配置文件映射了private final HttpEncodingProperties properties;//只有一个有参构造器的情况下,参数的值就会从容器中拿public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) {this.properties = properties;}@Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件?public CharacterEncodingFilter characterEncodingFilter() {CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();filter.setEncoding(this.properties.getCharset().name());filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST));filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));return filter;} }

可以从注解中看到它是一个配置类,并且从容器中拿到一个叫HttpEncodingProperties的类,将它的属性赋给filter,然后将filter也放到容器中,我们可以看看HttpEncodingProperties这个类是什么样子的:

@ConfigurationProperties(prefix = "spring.http.encoding") //从配置文件中获取指定的值和bean的属性进行绑定 public class HttpEncodingProperties {public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");...

可以看到它就是和Properties文件直接打交道的类了,所以你可以知道一般xxxAutoConfiguration和一个xxxProperties是一对的,这样一来Spring Boot就完成了配置过程。

总结

以上是生活随笔为你收集整理的Spring Boot自动配置原理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。