Spring-Boot 自动配置原理

配置文件能配置的属性参照

自动配置原理:

  • SpringBoot启动的时候加载主配置类,开启了自动配置功能 注解:@EnableAutoConfiguration
    在这里插入图片描述
  • @EnableAutoConfiguration作用:
    利用@Import({AutoConfigurationImportSelector.class})给容器中导入了一些组件
    可以查看selectImports()方法的内容;
    List configurationns = autoConfigurationEntry.getConfigurations() ; 获取候选的配置
    把扫描到的这些文件的内容包装成properties对象
    从properties中获取到AutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中
    将类路径下 META-INF/spring.factories里面配置的所有的EnableAutoConfiguration的值加入到了容器中
    每一个xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置
    -每一个自动配置类进行自动配置类功能
    在这里插入图片描述

以**HttpEncodingAutoConfiguration **为例解释自动配置原理(Http编码自动配置)

  • 查看HttpEncodingAutoConfiguration
@Configuration(
    proxyBeanMethods = false
)  //表示这是一个配置类,和编写的配置文件一样,也可以给容器添加组件
@EnableConfigurationProperties({ServerProperties.class})  //启动指定类的ConfigurationPproperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;并把ServerProperties加入到ioc容器中
@ConditionalOnWebApplication(
    type = Type.SERVLET
) //Spring底层@Conditional注解,根据不同条件,如果满足指定的条件,整个配置类里面的配置就会生效;  该处的作用是  判断当前应用是否是Web应用,如果是,当前配置类生效,否则不生效
@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有这个类 CharacterEncodingFilter:SpringMVC中进行乱码解决过滤器;
@ConditionalOnProperty(
    prefix = "server.servlet.encoding",
    value = {"enabled"},
    matchIfMissing = true
)  //判断配置文件中是否存在某个配置 server.servlet.encoding.enabled;如果不存在,判断也是成立的 matchIfMissing表示即使配置文件中不配置server.servlet.encoding.enabled=true,也是默认生效的
public class HttpEncodingAutoConfiguration {

		//代表他已经和SpringBoot的配置文件映射了
		private final Encoding properties;
		
		//只有一个有参构造器的情况下,参数的值就会从容器中拿
		public HttpEncodingAutoConfiguration(ServerProperties properties) {
		        this.properties = properties.getServlet().getEncoding();
		    }
		    
		@Bean //给容器中添加一个组件,这个组件的某些值,需要从properties中获取
	    @ConditionalOnMissingBean
	    public CharacterEncodingFilter characterEncodingFilter() {
	        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
	        filter.setEncoding(this.properties.getCharset().name());
	        filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST));
	        filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE));
	        return filter;
	    }

根据当前不同的条件判断,决定这个配置类是否生效
但这个配置类生效,这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的

  • 点入ServerProperties.class

@ConfigurationProperties(
    prefix = "server",
    ignoreUnknownFields = true
)  //从配置文件中获取指定的值和Bean属性进行绑定
public class ServerProperties {

所有在配置文件中能配置的属性都是在xxxxProperties类中封装者,配置文件能配置什么就可以参照某个功能对应的这个属性类

精髓

  • SpringBoot启动会加载大量的自动配置类
  • 看需要的功能有没有SpringBoot默认写好的自动配置类
  • 查看自动配置类中到低配置了而哪些组件(如果有,则不需要再配置)
  • 给容器中自动配置类中添加组件的时候,会从properties类中获取某些属性 ,可以在配置文件中指定这些属性的值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值