前些天栈长在Java技术栈微信公众号分享一篇文章:Spring Boot 面试,一个问题就干趴下了!,看到你们的留言很精彩,特别是说"约定大于配置"的这两个玩家。java
哈哈,上墙的朋友开不开森?面试
不错,约定优(大)于配置确实是 Spring Boot 整个框架的核心思想。spring
那么怎么理解约定优于配置呢?编程
百度百科定义:微信
约定优于配置(convention over configuration),也称做按约定编程,是一种软件设计范式,旨在减小软件开发人员需作决定的数量,得到简单的好处,而又不失灵活性。app
总结就是两点:框架
一、约定一些推荐的默认配置;源码分析
二、开发人员只须要规定不符约定的部分;this
这样作的好处就是,若是约定的默认配置符合咱们的要求,省略便可,反之,再进行额外配置。url
从 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 @ConditionalOnMissingBean public 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.. }
这是一个文件上传的自动配置类,约定了:
一、约定了配置参数以 spring.servlet.multipart
前缀开始;
二、约定了不少默认配置,如:默认上传文件大小为 1M;
三、约定了全部的参数配置类名都是 *Properties;
四、约定了全部的自动配置类名都是 *AutoConfiguration;
五、约定了全部自动配置类配置在:/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 新特性总结及迁移指南
- ……
本文原创首发于微信公众号:Java技术栈(id:javastack),转载请原样保留本信息。