《SpringBoot揭秘:快速构建微服务体系》—第3章3.4节再谈自动配置

3.4 再谈自动配置
此前我们讲到,@EnableAutoConfiguration可以借助SpringFactoriesLoader这个特性将标注了@Configuration的JavaConfig类“一股脑儿”的汇总并加载到最终的ApplicationContext,不过,这其实只是“简化版”的说明,实际上,基于@EnableAutoConfiguration的自动配置功能拥有更加强大的调控能力,通过配合比如基于条件的配置能力或者调整加载顺序,我们可以对自动配置进行更加细粒度的调整和控制。

3.4.1 基于条件的自动配置
基于条件的自动配置来源于Spring框架中“基于条件的配置”这一特性。在Spring框架中,我们可以使用@Conditional这个Annotation配合@Configuration或者@Bean等Annotation来干预一个配置或者bean定义是否能够生效,其最终实现的效果或者语义类似于如下伪代码:
if(符合@Conditional规定的条件){

加载当前配置(enable current Configuration)或者注册当前bean定义;

}
要实现基于条件的配置,我们只要通过@Conditional指定自己的Condition实现类就可以了(可以应用于类型Type的标注或者方法Method的标注):
@Conditional({MyCondition1.class, MyCondition2.class, ...})
最主要的是,@Conditional可以作为一个Meta Annotation用来标注其他Annotation实现类,从而构建各色的复合Annotation,比如SpringBoot的autoconfigure模块就基于这一优良的革命传统,实现了一批这样的Annotation(位于org.springframework.boot.autoconfigure.condition包下):

@ConditionalOnClass
@ConditionalOnBean
@ConditionalOnMissingClass
@ConditionalOnMissingBean
@ConditionalOnProperty
……

有了这些复合Annotation的配合,我们就可以结合@EnableAuto-Configurationn实现基于条件的自动配置了。
SpringBoot能够风靡,很大一部分功劳需要归功于它预先提供的一系列自动配置的依赖模块,而这些依赖模块都是基于以上@Conditional复合Annotation实现的,这也意味着所有的这些依赖模块都是按需加载的,只有符合某些特定条件,这些依赖模块才会生效,这也就是我们所谓的“智能”自动配置。

3.4.2 调整自动配置的顺序
在实现自动配置的过程中,除了可以提供基于条件的配置,我们还可以对当前要提供的配置或者组件的加载顺序进行相应调整,从而让这些配置或者组件之间的依赖分析和组装可以顺利完成。
我们可以使用@org.springframework.boot.autoconfigure.AutoConfigureBefore或者@org.springframework.boot.autoconfigure.AutoConfigureAfter让当前配置或者组件在某个其他组件之前或者之后进行,比如,假设我们希望某些JMX操作相关的bean定义在MBeanServer配置完成之后进行,那么我们就可以提供一个类似如下的配置:

@Configuration
@AutoConfigureAfter(JmxAutoConfiguration.class)
public class AfterMBeanServerReadyConfiguration {
    @Autowired
    MBeanServer mBeanServer;

    // 通过@Bean添加必要的bean定义
}
时间: 2024-10-04 17:12:12

《SpringBoot揭秘:快速构建微服务体系》—第3章3.4节再谈自动配置的相关文章

《SpringBoot揭秘:快速构建微服务体系》—第1章1.4节微服务会带来哪些挑战

1.4 微服务会带来哪些挑战微服务给我们带来的并非只有好处,还有相应的一些挑战.服务"微"化之后,一个显著的特点就是服务的数量增多了.如果将软件开发和交付也作为一种生产模式看待,那么数量众多的微服务实际上就类似于传统生产线上的产品,而在传统生产模型下,为了能够高效地生产大量产品,通常采用的就是标准化生产.比如在汽车产业,在福特T型车没有出来之前,大多汽车企业的生产效率都不高,而福特在引入标准化生产线之后,福特T型车得以大量生产并以低成本优势快速普及.在其他行业也是同样的道理,个性化生产

《SpringBoot揭秘:快速构建微服务体系》目录—导读

前 言为什么写这本书忘了是2015年的哪一天,只记得几个朋友跟友商的其他几个做技术的朋友吃饭,并简单做下技术交流.席间,友商的几位朋友对SpringBoot框架实施微服务很感兴趣,交谈甚欢之际,我无意间开玩笑说:"是不是该考虑写一本SpringBoot的书?"钟伦甫(原淘宝聚石)同学随口一句,"你倒是写啊!",得,以行践言吧,谁让你把话说出去了呢?当然,朋友的"热切期盼"只是其一,微服务盛行也是本书写作的一个契机, 希望本书成为国内第一本微服务相

《SpringBoot揭秘:快速构建微服务体系》—第1章1.1节了解微服务

第1章 了解微服务SpringBoot是一个可使用Java构建微服务的微框架,所以在了解SpringBoot之前,我们需要先了解什么是微服务.1.1 什么是微服务微服务(Microservice)虽然是当下刚兴起的比较流行的新名词,但本质上来说,微服务并非什么新的概念.实际上,很多SOA实施成熟度比较好的企业,已经在使用和实施微服务了.只不过,它们只是在闷声发大财,并不介意是否有一个比较时髦的名词来明确表述SOA的这个发展演化趋势罢了.微服务其实就是服务化思路的一种最佳实践方向,遵循SOA的思路

《SpringBoot揭秘:快速构建微服务体系》—第1章1.3节微服务会带来哪些好处

1.3 微服务会带来哪些好处显然,随着系统复杂度的提升,以及对系统扩展性的要求越来越高,微服务化是一个很好的方向,但除此之外,微服务还会给我们带来哪些好处?1.3.1 独立,独立,还是独立我们说微服务打响的是各自的独立战争,所以,每一个微服务都是一个小王国,这些微服务跳出了"大一统"(Monolith)王国的统治,开始从各个层面打造自己的独立能力,从而保障自己的小王国可以持续稳固的运转.首先,在开发层面,每个微服务基本上都是各自独立的项目(project),而对应各自独立项目的研发团队

《SpringBoot揭秘:快速构建微服务体系》—第3章3.3节SpringApplication:SpringBoot程序启动的一站式解决方案

3.3 SpringApplication:SpringBoot程序启动的一站式解决方案 如果非说SpringBoot微框架提供了点儿自己特有的东西,在核心类层面(各种场景下的自动配置一站式插拔模块,我们下一章再重点介绍),也就是SpringApplication了. SpringApplication将一个典型的Spring应用启动的流程"模板化"(这里是动词),在没有特殊需求的情况下,默认模板化后的执行流程就可以满足需求了:但有特殊需求也没关系,SpringApplication在

《SpringBoot揭秘:快速构建微服务体系》—第1章1.5节本章小结

1.5 本章小结在带领大家探索本书的主角SpringBoot微框架之前,本章首先为大家介绍了SpringBoot微框架服务的核心场景,即微服务.然后一起探索了微服务的概念以及由来,并探讨了微服务可以为我们带来哪些好处,以及同时又为我们带来哪些挑战.总的来说,微服务化虽然是当下流行的趋势,但并非任何场景都合适,我们还是要审慎地在"大一统"(Monolith)服务架构和微服务架构之间做出选择, 而一旦确定选择了微服务化之路,那么,就应该围绕团队和组织的主要语言生态以及微服务方向积极探索高效

《SpringBoot揭秘:快速构建微服务体系》—第3章3.5节本章小结

3.5 本章小结至此,我们对SpringBoot的核心组件完成了基本的剖析,综合来看,大部分的东西都是Spring框架背后原有的一些概念和实践方式,SpringBoot只是在这些概念和实践方式上对特定的场景实现进行了固化和升华,而也恰恰是这些固化让我们开发基于Spring框架的应用更加方便高效.如果SpringBoot真有什么秘密可言的话,那也是Spring框架和Spring生态圈的秘密,如果大家对Spring框架和其生态圈已经了然于心,通过本章的讲解,相信SpringBoot对大家已经无甚神秘

《SpringBoot揭秘:快速构建微服务体系》—第3章3.2节@SpringBootApplication背后的秘密

3.2 @SpringBootApplication背后的秘密@SpringBootApplication是一个"三体"结构,实际上它是一个复合Annotation: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Configuration @EnableAutoConfiguration @ComponentScan public @interface Spr

《SpringBoot揭秘:快速构建微服务体系》—第2章2.1节Spring框架的起源

第2章 饮水思源:回顾与探索Spring框架的本质SpringBoot框架的命名关键在"Boot"上,或许Boot Spring更能说明这个微框架设计的初衷,也就是快速启动一个Spring应用!所以,自始至终,SpringBoot框架都是为了能够帮助使用Spring框架的开发者快速高效地构建一个个基于Spring框架以及Spring生态体系的应用解决方案.要深刻理解SpringBoot框架,首先我们需要深刻理解Spring框架,所以让我们先来读读历史吧!2.1 Spring框架的起源虽