博客
关于我
Spring Boot @Enable*注解源码解析及自定义@Enable*
阅读量:455 次
发布时间:2019-03-06

本文共 4649 字,大约阅读时间需要 15 分钟。

Spring Boot 的一个重要特点就是自动配置,约定大于配置,几乎所有组件使用其本身约定好的默认配置就可以使用,大大减轻配置的麻烦。其中,@Enable*注解在实现自动配置方面发挥了重要作用。

Spring Boot 常用 @Enable* 注解

1. @EnableAutoConfiguration

@EnableAutoConfiguration 开启自动扫描装配Bean,组合成@SpringBootApplication注解之一。这个注解默认是开启的,用于让Spring Boot自动配置所有可用的功能模块。

2. @EnableScheduling

@EnableScheduling 开启计划任务的支持。这个注解比较特殊,它直接实现了计划任务的配置,而不是继承自Selector和Registrar接口。

3. @EnableTransactionManagement

@EnableTransactionManagement 开启注解式事务的支持。这个注解负责整合Spring的TransactionManagement,确保方法或切面能够正确处理事务。

4. @EnableCaching

@EnableCaching 开启注解式缓存支持。它负责整合Spring的缓存组件,允许开发者通过注解轻松配置缓存策略。

5. @EnableAspectJAutoProxy

@EnableAspectJAutoProxy 开启AspectJ自动代理的支持。这个注解负责处理AspectJ的自动代理功能,确保切面能够正确代理目标对象。

6. @EnableEurekaServer

@EnableEurekaServer 开启Eura卡服务注册与发现。这个注解用于配置Eura卡服务中心,支持服务的注册和发现功能。

7. @EnableDiscoveryClient

@EnableDiscoveryClient 开启服务提供者或消费者的支持。这个注解负责处理服务客户端的功能,允许应用程序连接到Eura卡或其他注册中心。

8. @EnableFeignClients

@EnableFeignClients 开启Feign功能。Feign是一个基于HTTP的声明式服务调用的框架,使用这个注解可以轻松配置Feign客户端。

不常用的 @Enable* 注解

除了上述常用的注解,还有一些不常用的注解可以根据需要选择使用:

1. @EnableAsync

@EnableAsync 开启异步方法的支持。这个注解用于配置异步方法,通常应用于需要提高性能的场景。

2. @EnableWebMvc

@EnableWebMvc 开启Web MVC配置支持。这个注解用于配置Web层的处理逻辑,适用于需要定制路由或处理的场景。

3. @EnableConfigurationProperties

@EnableConfigurationProperties 开启对@ConfigurationProperties注解配置Bean的支持。这个注解用于处理配置属性类,允许动态配置应用程序的行为。

4. @EnableJpaRepositories

@EnableJpaRepositories 开启Spring Data JPA Repository支持。这个注解用于配置JPA仓库,允许快速创建和管理数据库实体。

@Enable* 注解的源码解析

1. @EnableAutoConfiguration

@EnableAutoConfiguration 的实现通过@Import注解引入了AutoConfigurationImportSelector,继承自ImportSelector接口。这个注解负责扫描装配Bean,组合成@SpringBootApplication注解。

2. @EnableCaching

@EnableCaching 引入了CachingImportSelector,实现了ImportSelector接口。它负责配置缓存策略,根据注解属性动态配置缓存组件。

3. @EnableDiscoveryClient

@EnableDiscoveryClient 引入了DiscoveryImportSelector,继承自ImportSelector。它负责处理服务注册和发现功能,允许动态注册服务到Eura卡或其他注册中心。

4. @EnableFeignClients

@EnableFeignClients 引入了FeignImportSelector,实现了ImportSelector接口。它负责配置Feign客户端,支持动态管理HTTP客户端。

5. @EnableScheduling

@EnableScheduling 直接实现了SchedulingImportSelector接口,负责配置计划任务。它不继承Selector和Registrar接口,具有较高的自定义性。

源码规律及解析

所有@Enable*注解都使用了@Import注解来引入配置类。这些配置类实现了ImportSelector和ImportBeanDefinitionRegistrar接口。@ImportSelector接口的主要职责是获取需要导入的类,而@ImportBeanDefinitionRegistrar接口则用于注册这些类到Spring容器中。

ImportSelector vs ImportBeanDefinitionRegistrar

  • ImportSelector:返回需要导入的类名数组。
  • ImportBeanDefinitionRegistrar:不仅返回类名,还处理类的注册,允许对注册表进行修改。

两者的主要区别在于,ImportBeanDefinitionRegistrar支持更复杂的注册逻辑,适用于需要自定义注册行为的场景。

@Enable* 注解的实现示例

以@EnableDiscoveryClient为例:

public class EnableDiscoveryClientImportSelector implements ImportSelector {    @Override    public String[] selectImports(AnnotationMetadata annotationMetadata) throws AnnotationMetadataException {        AutoServiceRegistrationConfiguration autoServiceRegConfig = new AutoServiceRegistrationConfiguration(                annotationMetadata.getAnnotationAttributes(EnableDiscoveryClient.class.getName()));        return new String[] { AutoServiceRegistrationConfiguration.class.getName() };    }}

这个实现通过获取@EnableDiscoveryClient注解的属性,配置了AutoServiceRegistrationConfiguration类,并将其注册到Spring容器中。

自定义 @Enable* 注解

为了灵活配置,可以自定义@Enable*注解。以下是一个自定义注解的实现示例:

public @interface EnableSelfBean {    String[] packages() default "";}public class SelfEnableAutoConfig implements ImportSelector {    @Override    public String[] selectImports(AnnotationMetadata annotationMetadata) {        Map
attributes = annotationMetadata.getAnnotationAttributes(EnableSelfBean.class.getName()); if (attributes == null) { return new String[0]; } String[] packages = (String[]) attributes.get("packages"); if (packages == null || packages.length == 0 || packages[0].isEmpty()) { return new String[0]; } Set
classNames = new HashSet<>(); for (String packageName : packages) { classNames.addAll(ClassUtils.getClassName(packageName, true)); } return classNames.toArray(new String[0]); }}

这个自定义注解可以用来自动注册指定包下的所有类到Spring容器中,提升开发效率。

启动类示例

@SpringBootApplication@EnableSelfBean(packages = "com.kanlon.entity")public class SpringBootEnableApplication {    @Autowired    Role role;    public static void main(String[] args) {        ConfigurableApplicationContext context = SpringApplication.run(SpringBootEnableApplication.class, args);        System.out.println("已注册Bean:" + context.getBeanDefinitionNames());        System.out.println("已注册Role:" + context.getBean(Role.class));        System.out.println("Role的测试方法:" + context.getBean(SpringBootEnableApplication.class).role.test());    }}

总结

通过以上分析,可以了解到Spring Boot @Enable*注解的实现原理及其在项目中的应用。自定义注解则为开发者提供了更高的灵活性,能够根据项目需求进行个性化配置。

转载地址:http://vjzbz.baihongyu.com/

你可能感兴趣的文章
OpenCV(1)读写图像
查看>>
OpenCV:概念、历史、应用场景示例、核心模块、安装配置
查看>>
Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
查看>>
Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
查看>>
openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
查看>>
OpenMCU(一):STM32F407 FreeRTOS移植
查看>>
OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
查看>>
OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
查看>>
OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
查看>>
OpenPPL PPQ量化(5):执行引擎 源码剖析
查看>>
Openresty框架入门详解
查看>>
OpenResty(2):OpenResty开发环境搭建
查看>>
openshift搭建Istio企业级实战
查看>>
Openstack 之 网络设置静态IP地址
查看>>
OpenStack 网络服务Neutron详解
查看>>
Openstack(两控制节点+四计算节点)-1
查看>>
Openstack企业级云计算实战第二、三期培训即将开始
查看>>
OpenStack安装部署实战
查看>>
OpenStack的基本概念与架构详解
查看>>
Openstack的视频学习
查看>>