文档章节

SpringBoot自动配置小记

大_于
 大_于
发布于 2018/06/21 21:01
字数 797
阅读 34
收藏 0

    spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。

    不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱的感觉。简单记录一下:

    首先,要用注解引入一个功能,这个注解的命名格式往往是 Enable + 功能名。比如,EnableAuthorizationServer,要在基于spring框架的项目中引入OAuth2的授权服务器功能,需要在@Configuration注解的类上加入@EnableAuthorizationServer。

    第二步,跟着Enable注解引入的往往是需要真正被配置的的类,这些类往往是功能名 + Configuration,比如@EnableAuthorizationServer引入了AuthorizationServerEndpointsConfiguration和AuthorizationServerSecurityConfiguration,这两个类才是配置的核心所在。

    第三步:与xxxConfiguration相对应的是xxxConfigurer,这些Configurer将是暴露出来给使用框架的开发者,用它来自定义Configuration中的对象或参数进行自定义。然后Configuration类的做法往往是这样的,使用spring的DI机制,将BeanFactory容器中所有的xxxConfigure注入到一个队列中,然后将队列中的所有xxxConfigure的配置方法回调一下,达到最终配置的目的。 比如:

	@Autowired
	private List<AuthorizationServerConfigurer> configurers = Collections.emptyList();

当上面自动注入了之后,将做下面的事情:

	@PostConstruct
	public void init() {
		for (AuthorizationServerConfigurer configurer : configurers) {
			try {
				configurer.configure(endpoints);
			} catch (Exception e) {
				throw new IllegalStateException("Cannot configure enpdoints", e);
			}
		}
		endpoints.setClientDetailsService(clientDetailsService);
	}

    关于这一步,记住真正被需要的完成最终系统功能的对象都在xxxConfiguration中了。

第四步:为了方便xxxCofigure对某些特定类进行配置,常常会引入xxxBuilder。看看这Builder源码或许会发现代码绕来绕去的,但是Builder目的明确,就是构建某个类的对象中的属性值,记住这一点就可以了。另外对于xxxConfigure也需要记住一点,就是所有需要给配置的参数或者参数对象,都会列在xxxConfigure中,如果这里面没有你需要配置的参数,那就要想点其它方法了,比如用spring自带的代理机制。

第五步:到这里还没有自动配置什么事儿,其实自动配置也就是众多Configure中的一个,只不过它设定了所有需要参数的默认值。也因为这个原因,自动配置可以被其它配置改写或者顶替掉自动配置。自动配置常常被命名为xxxAutoConfiguration,比如OAuth2AutoConfiguration。

    综上所述,spring-boot项目中,其实是以@Enablexxx注解驱动某个功能,然后以xxxAutoConfiguration来填充默认值,如此就能保证这个功能以最基本的要求运行起来。而改变其中的默认行为,则需要通过定义xxxConfigure来完成。

 

 

© 著作权归作者所有

共有 人打赏支持
大_于
粉丝 3
博文 38
码字总数 18396
作品 0
南京
技术主管
私信 提问
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
2018/04/19
0
0
springboot情操陶冶-初识springboot

前言:springboot由于其轻便和去配置化等的特性已经被广泛应用,基于时代潮流以及不被鄙视,笔者于是开辟此篇开始认识springboot 前话 springboot是基于spring而开发的轻量级框架,所以在学习...

南柯问天
2018/07/24
0
0
《Spring Boot 实战:从0到1》第2章 快速开始Hello World

第2章 快速开始Hello World 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML。在二十世纪初期,新兴Java技术——Spring,横空出世。使用极简XML和POJO(...

程序员诗人
2017/08/01
0
0
SpringBootBucket 1.0.0 发布,SprintBoot 全家桶

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
7.3K
17
springboot 是如何帮我们省去web.xml配置的

概述 最开始使用原生的springmvc时,总是免不了有如下xml配置 但是,切换到springboot之后,web.xml之类的繁琐的配置基本上都不见了。出于好奇研究了下springboot究竟帮我们做了什么,我们可...

端吉
2018/06/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

tac 与cat

tac从后往前看文件,结合grep使用

writeademo
今天
2
0
表单中readonly和dsabled的区别

这两种写法都会使显示出来的文本框不能输入文字, 但disabled会使文本框变灰,而且通过通过表单提交时,获取不到文本框中的value值(如果有的话), 而readonly只是使文本框不能输入,外观没...

少年已不再年少
今天
2
0
SpringBoot上传图片操作

首先有个上传文件的工具类 /** * 文件上传 * @param file * @param filePath * @param fileName * @throws Exception */public static void uploadFile(byte[] file, String ...

_liucui_
今天
6
0
DrawerLayout

public class MainActivity extends BaseActivity implements NavigationView.OnNavigationItemSelectedListener,OnFragmentInteractionListener{ public NavigationView navView; ......

安卓工程师王恒
今天
2
0
python精简笔记

python精简笔记-字符串基本用法 字符串常见用法: * encode() # 编码成bytes类型 * find() # 查找子串 * index() # 获取下标 * replace() # 替换子串 * len(string) # 返回字符串长度,...

平头哥-Enjoystudy
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部