Spring @Enable模块装配的注解及编程实现方式,及包括“注解方式”,“编程方式”的自定义模块装配方式

Posted 阿啄debugIT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring @Enable模块装配的注解及编程实现方式,及包括“注解方式”,“编程方式”的自定义模块装配方式相关的知识,希望对你有一定的参考价值。

前言

通过模式注解的方式加载单一Bean,那如果有相关联的一系列Bean需要加载,是不是意味着每个被关联的类都需要单独加载呢?并不是哦!对于相关联的多个类。我们可以使用Enable方式同时加载多个类。同时Enable方式相比模式注解方式更灵活。常见的Enable方式有@EnableWebMvc、@EnableAutoConfiguration等。

Spring Framework 3.1 开始支持”@Enable 模块驱动“。所谓“模块”是指具备相同领域的功能组件集合, 组合所形成一个独立 的单元。比如 Web MVC 模块、AspectJ代理模块、Caching(缓存)模块、JMX(Java 管 理扩展)模块、Async(异步处 理)模块等。
Spring @Enable 模块装配

定义:具备相同领域的功能组件集合,组合所形成的一个独立的单元。
举例:@EnableWebMvc(自动组装webMvc)、@EnableAutoConfiguration(激活Springboot自动装配)等
实现:注解方式、编程方式

Spring @Enable 模块概览

框架实现@Enable注解模块激活模块
Spring Framework@EnableWebMvcWeb MVC 模块
@EnableTransactionManagement事务管理模块
@EnableCachingCaching 模块
@EnableMBeanExportJMX 模块
@EnableAsync异步处理模块
@EnableWebFluxWeb Flux 模块
@EnableAspectJAutoProxyAspectJ 代理模块
Spring Boot@EnableAutoConfiguration自动装配
@EnableManagementContextActuator 管理模块
@EnableConfigurationProperties配置属性绑定模块
@EnableOAuth2SsoOAuth2 单点登录模块
Spring Cloud@EnableEurekaServerEureka 服务器模块
@EnableConfigServer配置服务器模块
@EnableFeignClientsFeign 客户端模块
@EnableZuulProxy服务网关Zuul 模块
@EnableCircuitBreaker服务熔断模块

模块装配实现方式

注解方式

DelegatingWebMvcConfiguration类上的@Configuration,即代表了该实现方式为注解驱动 。

编程方式

 CachingConfigurationSelector类继承了AdviceModeImportSelector,即代表了接口编程的方式。
在采用接口编程方式时,其实只要实现ImportSelector接口即可。其实AdviceModeImportSelector也实现了ImportSelector接口。

自定义模块装配方式

注解方式

自定义Enable注解  

 编程方式

自定义Enable注解

总结 

@Import(HelloWorldConfiguration.class)引入配置类,而不是这个selector,同样也可以实现。但是为什么要要一圈呢?主要是因为多一层这个selector,可以在select里做一下流程控制。

实现自动装配只需要在resource下新建META-INF文件夹,然后加入

# /是换行符,这里的类名一般都很长为了方便阅读换行标注,多个类用逗号分隔
org.springframework.boot.autoconfigure.EnableAutoConfiguration=/
com.HelloWorldAutoConfiguration,TestConfiguration  

 spring.factories就像是工厂一样配置了大量的接口对应的实现类,我们通过这些配置 + 反射处理就可以拿到相应的实现类。这种类似于插件式的设计方式,只要引入对应的jar包,那么对应的spring.factories就会被扫描到,对应的实现类也就会被实例化,如果不需要的时候,直接把jar包移除即可。

如在springboot的各个依赖包下,我们经常看到META-INF/spring.factories这个文件。spring.factories文件的内容基本上都是这样的格式:

# Initializers
org.springframework.context.ApplicationContextInitializer=\\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\\org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

我们看到,这个文件配置了一个key:value格式的数据
1)key是:

org.springframework.context.ApplicationContextInitializer

2)value是:

org.springframework.context.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,org.springframework.context.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

key声明的是一个接口,value则是这个接口对应的实现类,如果有多个则以","符号分割。
简单来说,spring.factories文件包含了一些接口,及相对应的实现类的配置,我们通过这些配置就可以知道接口,有哪些可选的实现类,并通过反射获取对应的实例对象。

就像是简单工厂模式一样,也因此spring将这个文件定义为spring.factories这个名字。

  • Spring @Enable模块装配,在当前测试项目配置类中,通过@Enable*注解,引入需要的模块。
  • Spring @Enable模块装配中,都会将各模块中的配置类,通过@Import导入到当前项目配置类中。

以上是关于Spring @Enable模块装配的注解及编程实现方式,及包括“注解方式”,“编程方式”的自定义模块装配方式的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

Spring boot 自动装配

Spring boot 自动装配

Spring第七弹—依赖注入之注解方式注入及编码解析@Resource原理

007-Spring Boot @Enable*注解的工作原理

Spring的自动装配及注解开发(“最易懂得Spring学习”)