Spring Boot - 自动配置实例解读
文章目录
- 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 - 自动配置实例解读相关推荐
- springboot自动配置原理_今日份学习之Spring Boot自动配置实现原理
通过前面章节的学习,我们掌握了使用Spring Boot框架进行实际应用开发的方法.在使用Spring Boot 的过程中,我们时常会为一些看似简单,但实际上蕴藏了强大功能的实现而惊呼,下面就让我们来 ...
- 【Spring Boot实战】源码解析Spring Boot自动配置原理
一.简介 Spring致力于让Java开发更简单,SpringBoot致力于让使用Spring进行Java开发更简单,SpringCloud致力于基于SpringBoot构建微服务生态圈,让微服务开发 ...
- Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件
本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...
- spring boot自动配置
首先,一般的java Web项目需要很多配置,web配置(web.xml).spring配置(默认叫applicationContext.xml),非常繁琐 而spring-boot-starter是 ...
- Spring Boot自动配置原理
要了解Spring Boot的自动配置首先我需要先了解Spring Boot的两个机制,一个是配置文件如何进入到系统变成属性,二是如何将这些属性加入到容器中. 首先我们需要有一个组件,这个组件中的属性 ...
- Spring Boot自动配置原理、实战
Spring Boot自动配置原理 Spring Boot的自动配置注解是@EnableAutoConfiguration, 从上面的@Import的类可以找到下面自动加载自动配置的映射. org.s ...
- Spring Boot自动配置原理分析
一.写在前面 随着时间的迁移Spring Boot 越来越多的出现在Java 后端程序员的视野中,Spring Boot 之所以会那么流行,很大的一个原因是自身集成了很多的Bean,简化了传统Srin ...
- 芋道 Spring Boot 自动配置原理
转载自 芋道 Spring Boot 自动配置原理 1. 概述 友情提示:因为本文是分享 Spring Boot 自动配置的原理,所以需要胖友有使用过 Spring Boot 的经验.如果还没使用过 ...
- Spring Boot 自动配置的 “魔法” 是如何实现的?
转载自 Spring Boot 自动配置的 "魔法" 是如何实现的? Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数 ...
最新文章
- 机器视觉中如何选择工业相机与合适的相机镜头
- Python Numpy多维数组.sum(axis=0/1/2...) 详解
- 【Google Play】Google Play 开放式测试 ( 简介 | 发布开放式测试版本 )
- mysql ignore 1 lines_20190716MySQL基础操作(一)
- android view 渐变动画,Android自定义view渐变圆形动画
- (转)javascript实现导出Word、Excel
- 浅谈万进制算法与大数定理的结合(高精度乘除法,阶乘)
- 排查指南 | 关于 mPaaS-iOS 小程序打不开问题的解决方案
- 通信原理实验(〇):音频信号的播放蒙特卡洛模拟
- Django == Model基础
- 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker...
- mame 最新版本以及fba 编译
- Mac环境下设置打印机驱动程序
- python 实现批量抠图
- 达梦数据库表被锁住后解锁方法
- 星浩资本快速发展引擎:IT就是生产力
- oracle表连接查询逗号隔开_Oracle多表连接查询
- 利用java统计每天用户升级手机App信息
- 二叉树创建之先序法-递归算法
- Java虚拟机理解-内存管理
热门文章
- linux mysql libc.so_mysql-arm-linux-gcc编译报错:libc.soformatnotrecognized.
- PyTorch中的数据输入和预处理
- orb 算法源码实现
- C ++ 函数模板求三个数的最大和
- pytorch 入门(二) cnn 手写数字识别
- 【缺迪杰斯特拉和SPFA] 文巾解题 787. K 站中转内最便宜的航班
- tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?
- 【毕业求职季】-听说你想去大厂看学妹,教你京东软件产品经理面试如何一把过
- Python入门100题 | 第007题
- 超有用的,从此vi变得友好了