文章目录

  • Pre
  • 启用 debug=true输出自动配置
  • HttpEncodingAutoConfiguration
    • 什么情况下,Spring Boot 会自动装配 HttpEncodingAutoConfiguration
    • @EnableConfigurationProperties & ServerProperties
    • 是否生效演示
  • 原理流程图


Pre

Spring Boot - 自动配置实现原理中我们说了自动装配的原理,这里我们继续接着说,用一个自动装配的例子,来感受下Spring Boot 的魅力


启用 debug=true输出自动配置

我们新建一个SpringBoot的工程,在application.properties中 开启属性设置

debug=true

启动工程后,输出的格式如下

 ============================
CONDITIONS EVALUATION REPORT
============================Positive matches:---**表示自动配置类启用的**
-----------------
...省略...Negative matches:---**没有匹配成功的自动配置类**
-----------------
...省略...

我们找个看看吧


HttpEncodingAutoConfiguration

  • @Configuration(proxyBeanMethods = false)

    标记了@Configuration Spring底层会给配置创建cglib动态代理。 作用:就是防止每次调用本类的Bean方法而重新创建对象,Bean是默认单例的

  • @EnableConfigurationProperties(ServerProperties.class)

    启用可以在配置类设置的属性 对应的类

  • @ConditionalXXX 根据当前不同的条件判断,决定这个配置类是否生效

    @Conditional派生注解(Spring注解版原生的@Conditional作用)
    作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;


以前写过一篇@Condition的,请移步 Spring - @Conditional全解

@Conditional扩展注解 作用(判断是否满足当前指定条件)
@ConditionalOnJava 系统的java版本是否符合要求
@ConditionalOnBean 容器中存在指定Bean;
@ConditionalOnMissingBean 容器中不存在指定Bean;
@ConditionalOnExpression 满足SpEL表达式指定
@ConditionalOnClass 系统中有指定的类
@ConditionalOnMissingClass 系统中没有指定的类
@ConditionalOnSingleCandidate 容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty 系统中指定的属性是否有指定的值
@ConditionalOnResource 类路径下是否存在指定资源文件
@ConditionalOnWebApplication 当前是web环境
@ConditionalOnNotWebApplication 当前不是web环境
@ConditionalOnJndi JNDI存在指定项

什么情况下,Spring Boot 会自动装配 HttpEncodingAutoConfiguration

我们来分析下 在满足什么情况下,Spring Boot 会自动装配 HttpEncodingAutoConfiguration

主要都在这里了

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ServerProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
  • @Configuration:表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件

  • @ConditionalOnWebApplication:Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,当前配置类生效

  • @ConditionalOnClass:判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器

  • @ConditionalOnProperty:判断配置文件中是否存在某个配置 spring.http.encoding.enabled;如果不存在,判断也是成立的 . 即使我们配置文件中不配置server.servlet.encoding.enabled=true,也是默认生效的

  • @EnableConfigurationProperties({ServerProperties.class}):将配置文件中对应的值和 ServerProperties绑定起来;并把 ServerProperties加入到 IOC 容器中并注册. ConfigurationPropertiesBindingPostProcessor用于将@ConfigurationProperties的类和配置进行绑定


@EnableConfigurationProperties & ServerProperties

ServerProperties通过 @ConfigurationProperties 注解将配置文件与自身属性绑定。

@ConfigurationProperties注解的作用就是把全局配置文件中的值绑定到实体类JavaBean上面(将配置文件中的值与ServerProperites绑定起来),而@EnableConfigurationProperties主要是把以绑定值JavaBean加入到spring容器中。

举个例子: 我们在application.properties 声明spring.application.name 是通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上,然后再通过@EnableConfigurationProperties注解导入到Spring容器中.


是否生效演示

我们知道了 Web环境 会生效

非web环境,我们搞一把


not match


加入

     <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

以debug=true的形式启动

还记得另外一个属性吗?

@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)

我们设置成 false试试

重启 没有自动装配,原因也在下方体现了


原理流程图

Spring Boot - 自动配置实例解读相关推荐

  1. springboot自动配置原理_今日份学习之Spring Boot自动配置实现原理

    通过前面章节的学习,我们掌握了使用Spring Boot框架进行实际应用开发的方法.在使用Spring Boot 的过程中,我们时常会为一些看似简单,但实际上蕴藏了强大功能的实现而惊呼,下面就让我们来 ...

  2. 【Spring Boot实战】源码解析Spring Boot自动配置原理

    一.简介 Spring致力于让Java开发更简单,SpringBoot致力于让使用Spring进行Java开发更简单,SpringCloud致力于基于SpringBoot构建微服务生态圈,让微服务开发 ...

  3. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  4. spring boot自动配置

    首先,一般的java Web项目需要很多配置,web配置(web.xml).spring配置(默认叫applicationContext.xml),非常繁琐 而spring-boot-starter是 ...

  5. Spring Boot自动配置原理

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

  6. Spring Boot自动配置原理、实战

    Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...

  7. Spring Boot自动配置原理分析

    一.写在前面 随着时间的迁移Spring Boot 越来越多的出现在Java 后端程序员的视野中,Spring Boot 之所以会那么流行,很大的一个原因是自身集成了很多的Bean,简化了传统Srin ...

  8. 芋道 Spring Boot 自动配置原理

    转载自  芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...

  9. Spring Boot 自动配置的 “魔法” 是如何实现的?

    转载自  Spring Boot 自动配置的 "魔法" 是如何实现的? Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数 ...

最新文章

  1. 机器视觉中如何选择工业相机与合适的相机镜头
  2. Python Numpy多维数组.sum(axis=0/1/2...) 详解
  3. 【Google Play】Google Play 开放式测试 ( 简介 | 发布开放式测试版本 )
  4. mysql ignore 1 lines_20190716MySQL基础操作(一)
  5. android view 渐变动画,Android自定义view渐变圆形动画
  6. (转)javascript实现导出Word、Excel
  7. 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)
  8. 排查指南 | 关于 mPaaS-iOS 小程序打不开问题的解决方案
  9. 通信原理实验(〇):音频信号的播放蒙特卡洛模拟
  10. Django == Model基础
  11. 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker...
  12. mame 最新版本以及fba 编译
  13. Mac环境下设置打印机驱动程序
  14. python 实现批量抠图
  15. 达梦数据库表被锁住后解锁方法
  16. 星浩资本快速发展引擎:IT就是生产力
  17. oracle表连接查询逗号隔开_Oracle多表连接查询
  18. 利用java统计每天用户升级手机App信息
  19. 二叉树创建之先序法-递归算法
  20. Java虚拟机理解-内存管理

热门文章

  1. linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
  2. PyTorch中的数据输入和预处理
  3. orb 算法源码实现
  4. C ++ 函数模板求三个数的最大和
  5. pytorch 入门(二) cnn 手写数字识别
  6. 【缺迪杰斯特拉和SPFA] 文巾解题 787. K 站中转内最便宜的航班
  7. tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?
  8. 【毕业求职季】-听说你想去大厂看学妹,教你京东软件产品经理面试如何一把过
  9. Python入门100题 | 第007题
  10. 超有用的,从此vi变得友好了