文档章节

SpringBoot自动配置小记

大_于
 大_于
发布于 06/21 21:01
字数 797
阅读 32
收藏 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
博文 36
码字总数 14192
作品 0
南京
技术主管
恒宇少年/spring-boot-chapter

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

恒宇少年
04/19
0
0
Spring Boot 全家桶 - SpringBootBucket

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

一刀
03/05
0
1
springboot情操陶冶-初识springboot

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

南柯问天
07/24
0
0
【SpringBoot专题】快速体验

前言 在Spring 4推出来之前,我们的编码是存在一些问题,比如:大量的xml配置存在项目中,配置相当繁琐;整合第三方框架非常麻烦;开发效率和部署效率不高等问题。正是因为这些问题,Spring开...

张丰哲
08/05
0
0
spring boot整合Websocket笔记

特别说明:自学笔记 使用websocket有两种方式: 使用sockjs, 使用h5的标准。 使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法。 1、pom.xml中添加如下: 核心是@ServerEndpoint...

jackcooper2015
2017/12/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

storm drpc实例

序 本文主要演示一下storm drpc实例 配置 version: '2'services: supervisor: image: storm container_name: supervisor command: storm supervisor -c storm.......

go4it
28分钟前
0
0
官宣 | Chrome 70正式向所有HTTP网站发出红色“不安全”警告!

10月17日,坐拥10亿用户的Chrome浏览器正式上线70版本。作为第一个采用TLS1.3正式版的Chrome版本,在安全新功能方面,Chrome 70进一步升级了HTTP页面“不安全”显示标识,即当用户输入数据时...

亚洲诚信
29分钟前
4
0
mysql 数据类型及占用字节数

数字类型 TINYINT                           1 字节 SMALLINT                          2 个字节 MEDIUMINT                         3 个字节...

会游泳的鱼_
今天
6
0
高性能mysql:创建高性能的索引

性能优化简介 MySQL性能定义为完成某件任务所需要的时间量度,换句话说,性能即响应时间,这是一个非常重要的原则。我们通过任务和时间而不是资源来测量性能。数据库服务器的目的是执行SQL语...

背后的辛酸
今天
8
0
HTTP get、post 中请求json与map传参格式

import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;im......

寒风中的独狼
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部