Springboot自动配置原理(举例)

Spring Boot 学习笔记

微服务架构

如何创建一个 Spring boot

  1. 可以直接在官网配置好后下载压缩包解压项目

网站链接

  1. 直接使用IDEA创建Springboot项目 (开发常用)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOzVK4qT-1583743897959)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200304223323089.png)]

目录解析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QiCfJBcq-1583743897965)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20200304235103054.png)]

pom.xml

  • spring-boot-dependencies: 核心依赖在父工程中!
  • 我们在写或者引入一些Springboot依赖的时候, 不需要指定版本,就因为有这些版本仓库
  • 比如 spring-boot-starter-web 他会帮我们自动导入web环境所有的依赖
  • springboot会将所有的功能场景,都变成一个个的启动器

主程序

@SpringBootApplication
public class Springboot01Application {

    public static void main(String[] args) {
        //将springboot应用启动
        SpringApplication.run(Springboot01Application.class, args);
    }

}

application.yaml

配置文件,可配置端口号等信息 及 配置对象

server:
  port: 80

person:
  name: lyc
  age: 21
  happy: false
  brith: 2020/03/06
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - movie
    - music
  dog:
    name: 旺财
    age: 3

这样配好后即可在Person类上添加注解

//告诉springboot 本类去注入 配置文件中写好了属性的对象
@ConfigurationProperties(prefix = "person")
@Component

在程序中获取对象时则无需再赋值 或 用@Value赋值

/**。 classpath:/META-INF/resources,classpath:/resources,classpath:/static/,classpath:/public/

自动配置分析

HttpEncodingAutoConfiguration为例

HttpEncodingAutoConfiguration.java

@Configuration(proxyBeanMethods = false)  //表示这是一个配置类像以前的配置文件,可以给容器中添加组组件                             proxyBeanMethods 代表其他类能否访问这个类下的@bean类
@EnableConfigurationProperties(HttpProperties.class)//启用指定类的ConfigurationProperties功能,并且把HttpProperties加入到容器中,下面有参构造就可以读取到HttpProperties对象 
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
//满足 当前这个应用是web应用  的条件时   ,  才会让这个当前这个类生效
@ConditionalOnClass(CharacterEncodingFilter.class)
//满足 当前项目有CharacterEncodingFilter这个类(Springmvc中的乱码的过滤器)  的条件时   ,  才会让这个当前这个类生效
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
//满足 配置文件中存在spring.http.encoding.enabled这个配置 或者 前者判断不存在(好像有点矛盾,反正这个类一定会生效的意思)   的条件时   ,  才会让这个当前这个类生效
//即使不配置spring.http.encoding.enabled,也默认生效

HttpProperties.java

@ConfigurationProperties(prefix = "spring.http") //从配置文件获取指定的值进行绑定
public class HttpProperties {
    //HTTP encoding properties.
	private final Encoding encoding = new Encoding();
    public static class Encoding {
		 /*可以通过配置文件中的
		 spring:
		 	http:
		 		encoding:
		 			charset: 
  的值来获取, 同样下的force、forceRequest、forceRequest、forceResponse······也是如此
      	*/
		public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
		private Charset charset = DEFAULT_CHARSET;
		private Boolean force; 
		private Boolean forceRequest;
		private Boolean forceResponse;
		private Map<Locale, Charset> mapping;
		public Charset getCharset() {
			return this.charset;
		}
        public void setCharset(Charset charset) {
			this.charset = charset;
		}
    }

当HttpEncodingAutoConfiguration上的注解条件满足 生效后, 回来再看这个类

HttpEncodingAutoConfiguration.java

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
    //他已经和springboot的配置文件映射了
	private final HttpProperties.Encoding properties;
	
    //只有一个有参构造的情况下,参数值就会从容器中拿
	public HttpEncodingAutoConfiguration(HttpProperties properties) {
		this.properties = properties.getEncoding();
	}

	@Bean //给容器中增加一个组件  这个组件的某些值需要从properties中获取
	@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;
	}

	@Bean
	public LocaleCharsetMappingsCustomizer localeCharsetMappingsCustomizer() {
		return new LocaleCharsetMappingsCustomizer(this.properties);
	}

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

总结

springboot启动的时候会去加载所有包下的MATE_INF/spring.factories里的自动配置类XXXAutoConfiguration,这个自动配置类的@Configuration表示这是一个java配置类 ,可以和@Bean共同使用向容器中注入组件,而这些组件需要一些配置信息 然后这个自动配置类通过注解@EnableConfigurationProperties(XXX.Properties.class)对应一个Properties的配置文件 拿到配置信息,而配置文件又可以通过注解@ConfigurationProperties(prefix=“xxx.xx”)绑定yml配置文件里的前缀.一般使用默认配置,想修改的话在application.yml配置文件中修改对应属性。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值