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

本文共 4686 字,大约阅读时间需要 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/

你可能感兴趣的文章
Objective-C实现找出二维数组中的鞍点(附完整源码)
查看>>
Objective-C实现找出由两个 3 位数字的乘积构成的最大回文数的算法 (附完整源码)
查看>>
Objective-C实现找出矩阵的最大最小值(附完整源码)
查看>>
Objective-C实现找到一个数字数组的中值算法(附完整源码)
查看>>
Objective-C实现找到具有 500 个除数的第一个三角形数算法(附完整源码)
查看>>
Objective-C实现找到最近的点对之间的距离算法(附完整源码)
查看>>
Objective-C实现抓包实例(附完整源码)
查看>>
Objective-C实现抽签抓阄(附完整源码)
查看>>
Objective-C实现抽象工厂模式(附完整源码)
查看>>
Objective-C实现拉格朗日插值法(附完整源码)
查看>>
Objective-C实现拉格朗日插值算法(附完整源码)
查看>>
Objective-C实现拓扑排序算法(附完整源码)
查看>>
Objective-C实现拦截输入法(附完整源码)
查看>>
Objective-C实现括号匹配(附完整源码)
查看>>
Objective-C实现拷贝二进制文件(附完整源码)
查看>>
Objective-C实现指定内存空间获取时间的函数(附完整源码)
查看>>
Objective-C实现指定点 x 处计算多项式 f(x) 并返回值算法(附完整源码)
查看>>
Objective-C实现按位倒序(附完整源码)
查看>>
Objective-C实现按位的isPowerOfTwo算法(附完整源码)
查看>>
Objective-C实现按位运算将两个有符号数相乘multiply算法(附完整源码)
查看>>