前些天栈长在Java技术栈微信公众号分享一篇文章:Spring Boot 面试,一个问题就干趴下了!,看到大家的留言很精彩,特别是说"约定大于配置"的这两个玩家。

哈哈,上墙的朋友开不开森?

不错,约定优(大)于配置确实是 Spring Boot 整个框架的核心思想。

那么怎么理解约定优于配置呢?

百度百科定义:

约定优于配置(convention over configuration),也称作按约定编程,是一种软件设计范式,旨在减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

总结就是两点:

1、约定一些推荐的默认配置;

2、开发人员只需要规定不符约定的部分;

这样做的好处就是,如果约定的默认配置符合我们的要求,省略即可,反之,再进行额外配置。

从 Spring Boot 中提供的默认的配置文件(application.properties/yml),再到默认值自动配置,都可以看出约定带来的便利,以及节省大量的配置。

来看下 Spring Boot 中一个自动配置的源码实例吧:

@Configuration
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class,MultipartConfigElement.class })
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {private final MultipartProperties multipartProperties;public MultipartAutoConfiguration(MultipartProperties multipartProperties) {this.multipartProperties = multipartProperties;}@Bean@ConditionalOnMissingBeanpublic MultipartConfigElement multipartConfigElement() {return this.multipartProperties.createMultipartConfig();}@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)@ConditionalOnMissingBean(MultipartResolver.class)public StandardServletMultipartResolver multipartResolver() {StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());return multipartResolver;}}@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
public class MultipartProperties {/*** Whether to enable support of multipart uploads.*/private boolean enabled = true;/*** Intermediate location of uploaded files.*/private String location;/*** Max file size. Values can use the suffixes "MB" or "KB" to indicate megabytes or* kilobytes, respectively.*/private String maxFileSize = "1MB";/*** Max request size. Values can use the suffixes "MB" or "KB" to indicate megabytes or* kilobytes, respectively.*/private String maxRequestSize = "10MB";/*** Threshold after which files are written to disk. Values can use the suffixes "MB"* or "KB" to indicate megabytes or kilobytes, respectively.*/private String fileSizeThreshold = "0";/*** Whether to resolve the multipart request lazily at the time of file or parameter* access.*/private boolean resolveLazily = false;// get/set/etc..}

这是一个文件上传的自动配置类,约定了:

1、约定了配置参数以 spring.servlet.multipart 前缀开始;

2、约定了很多默认配置,如:默认上传文件大小为 1M;

3、约定了所有的参数配置类名都是 *Properties;

4、约定了所有的自动配置类名都是 *AutoConfiguration;

5、约定了所有自动配置类配置在:/META-INF/spring.factories;

等等……

这样我们做一个文件上传操作几乎不用写任何配置了,除非满足不了需求,如:现在文件上传 1M 太小了,再加一行自定义配置即可,我们也可以按约定编写其他自动配置。

如果还不能理解,再来看 Maven 怎么做的,Maven 简直把约定大于配置的思想体现淋漓尽致。

Maven规定了哪个目录放什么文件,哪个文件做什么用,Maven会自动去处理,不需要我们再额外配置,其实我们也没有额外配置的需要,至少栈长我现在还没有遇到过。如果这些目录都让你来通过配置文件来配置,而每个项目配置的又不一样,你会不会想要崩溃?

其实这也不是新技术,只是一种设计思想,早在 JDK 1.5 中添加的《Java注解》就是很好的体现。

关于 “约定优于配置” 的思想,你还有什么好的想法,欢迎留言分享~

好了,今天的分享就到这里,关注Java技术栈微信公众号,在后台回复:boot,获取栈长整理的更多的 Spring Boot 教程,都是实战干货,以下仅为部分预览。

  • Spring Boot 读取配置的几种方式

  • Spring Boot 如何做参数校验?

  • Spring Boot 最核心的 25 个注解!

  • Spring Boot 2.x 启动全过程源码分析

  • Spring Boot 2.x 新特性总结及迁移指南

SpringBoot如何实现自动配置相关推荐

  1. SpringBoot SimpleCacheConfiguration的自动配置原理

    引言   在之前的博客中分享了简单的SpringBoot缓存的HelloWorld程序,在篇博客中主要来分析一下SpringBoot对于缓存自动配置的原理 缓存自动配置原理   首先在SpringBo ...

  2. SpringBoot面试杀手锏——自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/u014745069/ article/details/83820511 引言 不论在工作中,亦或 ...

  3. 【springboot】之自动配置原理

    使用springboot开发web应用是很方便,只需要引入相对应的GAV就可以使用对应的功能,springboot默认会帮我们配置好一些常用配置.那么springboot是怎么做到的呢?这篇文章将一步 ...

  4. SpringBoot之SpringMVC自动配置

    关于SpringBoot中的SpringMVC自动配置的一些思考 : 自动配置 Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默认配置:(We ...

  5. Springboot面试杀手锏-自动配置原理

    前言 随着互联网越来越流行,springboot已经成为我们无论是工作,还是面试当中,不得不掌握的技术.说起springboot笔者认为最重要的功能非自动配置莫属了,为什么这么说?如果参与过以前spr ...

  6. springboot框架笔记——springboot提供的自动配置

    Springboot基本配置 spring MVC的定制配置需要我们的配置实现一个WebMvcConfigurer接口,如果实在spring环境下需要使用@EnableWebMVC注解,来开启对spr ...

  7. 【Spring框架家族】SpringBoot自动配置原理源码跟进

    继承springboot父工程依赖pox.xml <dependency><groupId>org.springframework.boot</groupId>&l ...

  8. SpringBoot 自动配置

    Springboot 自动配置 关注 "弋凡"(YiFan)微信公众号吧 记录简单笔记 做你的最爱 Springboot 是什么呐? 我管她是什么,好用就行了啊!!! spring ...

  9. SpringBoot | 自动配置原理

    微信公众号:一个优秀的废人.如有问题,请后台留言,反正我也不会听. 前言 这个月过去两天了,这篇文章才跟大家见面,最近比较累,大家见谅下.下班后闲着无聊看了下 SpringBoot 中的自动配置,把我 ...

  10. 注解不自动导包_玩转SpringBoot2.X:SpringBoot自动配置原理大揭秘

    我们在使用SpringBoot的时候,是不是觉得特方便,根本不需要我们去配置什么端口号,应用名称,又比如我们再整合redis的时候,其实也不需要我们去指定端口号,IP,都会有默认的.是不是特方便.那么 ...

最新文章

  1. AI 如果 “智力爆炸” ,只有普通智力的人类是蝼蚁还是宠物?
  2. startprocessinstancebykey()里面填写的参数_3种方法,快速学会在Word文档里面如何插入表格...
  3. php函数变成变量,为什么我不能在PHP函数中将函数作为默认变量提供?
  4. 浅析一般网站建设的需要耗费多长时间?
  5. 开发日记 20200129 新年这几天的总结
  6. Wijmo 更优美的jQuery UI部件集:爱上 ThemeRoller
  7. MyBatis 源码解读-会话创建过程
  8. 安卓如何调出软键盘_智能汽车到底如何交互?小鹏用全场景语音给出了答案
  9. 如何使用 Serverless Devs 部署静态网站到函数计算(上)
  10. mysql count转字符串_MySQL字符串函数
  11. 遇到error: stray ‘\357’ in program [solution.c]的解决办法
  12. wordpress模板
  13. 产品经理|竞品分析(附《竞品分析报告》模板)
  14. MAC PHP集成环境安装MAMP
  15. 如何删除Windows创建的虚拟磁盘
  16. 有线猫眼监控_如何安装有线监控摄像头系统
  17. 图像处理之灰色图转化为RGB图像
  18. adsl拨号服务器构建代理池
  19. 钉钉邮箱登录入口_钉邮的使用攻略②
  20. Visual Studio 2015、2013、2012、2010、2008、2005各版本下载+有效密钥激活

热门文章

  1. Scrapy框架的使用之Spider Middleware的用法
  2. 锚点盒子随滚动条浮动
  3. 顶级SaaS公司的共同基因都有什么?
  4. Spring MVC深入讲解
  5. VS2010下配置 OpenCV2.2
  6. 成功数据恢复一例MYSQL数据库记录恶意删除
  7. MAC安装软件 brew 问题记录
  8. Android P环境 bootchart使用
  9. w3wp对应进程_认识w3wp.exe进程,从根本上解决占用资源较大问题
  10. Androd UI学习之ImageSwitcher