深入了解springboot自动配置原理

springboot的精髓是自动配置,在之前的文章中我通过helloworld的例子分析了springboot启动时是如何加载自动配置类,加载了哪些配置类,这次我们来深入了解一下自动配置的类是如何生效的,并且在yaml中可以配置哪些属性。

找到spring-boot-autoconfigure.jar中的META-INF下的spring.factories,其中属性EnableAutoConfiguration下的值就是boot项目自动导入的配置类,我们以最简单的HttpEncodingAutoConfiguration为例子开始分析过程,其他配置类都大同小异

@Configuration
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

	private final HttpProperties.Encoding properties;

	public HttpEncodingAutoConfiguration(HttpProperties properties) {
		this.properties = properties.getEncoding();
	}

	@Bean
	@ConditionalOnMissingBean
	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;
	}

 @Configuration是声明这个类是一个配置类

@EnableConfigurationProperties(HttpProperties.class)是开启HttpProperties的配置文件编写功能,将配置文件对应的值和HttpProperties进行绑定

@Conditional是spring的底层注解,用来满足条件判断才可生效

@ConditionalOnWebApplication的作用是判断此项目是不是一个web应用,是web应用才生效配置

@ConditionalOnClass的作用是查询项目中有没有这个类

@ConditionalOnProperty的作用是判断配置文件中有没有这个属性

这几个注解是自动配置类共同存在的注解,目的是进行判断,满足条件了自动配置类才会生效,至于配置文件中我们可以配置哪些属性,从@EnableConfigurationProperties中可以看出传了属性配置参数HttpProperties.class

 

@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {

	/**
	 * Configuration properties for http encoding.
	 */
	public static class Encoding {

		public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

		private Charset charset = DEFAULT_CHARSET;

		private Boolean force;

		private Boolean forceRequest;

		private Boolean forceResponse;

 这个类里就是可以在配置文件中配置的属性,通过@ConfigurationProperties(prefix = "spring.http")达到配置和类属性一一对应,所以我们可以总结出以下几点经验:

1、SpringBoot启动会加载大量的自动配置类

2、我们看我们需要的功能有没有SpringBoot默认写好的自动配置类

3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)​

4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;

 

如果我们想要看一下哪些配置类没生效,在application.properties中配置上debug=true,springboot启动时会在控制台打印出自动配置是否生效报告,比如生效的配置类

Positive matches:
-----------------

   CodecsAutoConfiguration matched:
      - @ConditionalOnClass found required class 'org.springframework.http.codec.CodecConfigurer' (OnClassCondition)

不生效的配置类

Negative matches:
-----------------

   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'javax.jms.ConnectionFactory' (OnClassCondition)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值