Springboot基于enable模块驱动的实现
enable作为模块驱动在SpringFarmework、SpringBoot、SpringCloud使用,都是通过注解的形式以@enable作为前缀,一些常用注解如
| 框架 | 注解 | 模块 |
|---|---|---|
| SpringFramework | @EnableWebMvc | WebMVC模块 |
| SpringFramework | @EnableTransactionmanagement | WebMVC模块 |
| SpringFramework | @EnableCacheing | Cacheing模块 |
| SpringFramework | @EnableMBeanExport | JMX模块 |
| SpringFramework | @EnableWebFlux | WebFlux模块 |
| SpringFramework | @EnableAspectJAutoProxy | AspectJ模块 |
| SpringBoot | @EnableAutoConfiguration | 自动装配模块 |
| SpringBoot | @EnableWebManagementContext | Actuator模块 |
| SpringBoot | @EnableConfigurationProperties | 配置属性绑定模块 |
| SpringBoot | @EnableOauth2Sso | OAuth2单独登录模块 |
| SpringCloud | @EnableEurekaServer | eureka服务模块 |
| SpringCloud | @EnableConfigServer | 配置服务器模块 |
| SpringCloud | @EnableFeignClients | Feign客户端模块 |
| SpringCloud | @EnableZuulProxy | 服务网关zuul模块 |
| SpringCloud | @EnableCircuitBreaker | 服务熔断模块 |
如何自定义enable开发?
基于ImportSelector实现注解驱动
自定义接入类型
Access为接入类型的接口,下文的RPC接入和REST接入基于这个实现,定义两个接口,一个为启动,一个停止,内部嵌套一个枚举用于标识是哪一种接入
publicinterfaceAccess{
/**
*初始化配置
*/
voidstart();
/**
*销毁配置
*/
voidstop();
enumType{
REST,
RPC
}
}
定义RPC和REST的实现
REST实现,只是简单的打印方法
publicclassRestAccessimplementsAccess{
@Override
publicvoidstart(){
System.out.println("rest接入配置");
}
@Override
publicvoidstop(){
System.out.println("rest接入销毁配置");
}
}
RPC实现
publicclassRpcAccessimplementsAccess{
@Override
publicvoidstart(){
System.out.println("rpc接入配置");
}
@Override
publicvoidstop(){
System.out.println("rpc接入销毁配置");
}
}
自定义注解EnableAccess
接入类型为RPC或者REST,AccessImportSelector在下一步骤实现
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AccessImportSelector.class)
public@interfaceEnableAccess{
/**
*接入类型
*@return
*/
Access.Typetype();
}
实现ImportSelector
定义AccessImportSelector实现ImportSelector,分别获取注解信息,根据注解获取接入类型,根据接入类型选择不同的接入类型
publicclassAccessImportSelectorimplementsImportSelector{
@Override
publicString[]selectImports(AnnotationMetadataannotationMetadata){
//读取EnableAccess中所有的属性方法
MapannotationAttributes=annotationMetadata.getAnnotationAttributes(EnableAccess.class.getName());
//获取属性为type的属性方法
Access.Typetype=(Access.Type)annotationAttributes.get("type");
//导入的类名称数组
String[]importClassName=newString[0];
switch(type){
caseRPC:
//设置为RPC,返回RpcAccess组件
importClassName=newString[]{RpcAccess.class.getName()};
break;
caseREST:
//设置为REST,返回RestAccess组件
importClassName=newString[]{RestAccess.class.getName()};
}
returnimportClassName;
}
}
使用
在primarySource也就是这里的DemoApplication上使用注解EnableAccess,选择接入方式,就会初始化不通的接入组件
@SpringBootApplication
@EnableAccess(type=Access.Type.REST)
publicclassDemoApplication{
publicstaticvoidmain(String[]args){
ConfigurableApplicationContextcontext=SpringApplication.run(DemoApplication.class,args);
Accessaccess=context.getBean(Access.class);
access.start();
access.stop();
}
}
基于ImportBeanDefinitionRegistrar实现注解驱动
这里其它步骤一样,主要区别是注解里面Import的类变了,这里是基于基于ImportBeanDefinitionRegistrar实现注解驱动实现
自定义ImportBeanDefinitionRegistrar
publicclassAccessImportBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrar{
@Override
publicvoidregisterBeanDefinitions(AnnotationMetadataannotationMetadata,BeanDefinitionRegistrybeanDefinitionRegistry){
ImportSelectorimportSelector=newAccessImportSelector();
//筛选class名称集合
String[]selectedClassNames=importSelector.selectImports(annotationMetadata);
Stream.of(selectedClassNames)
.map(BeanDefinitionBuilder::genericBeanDefinition)
.map(BeanDefinitionBuilder::getBeanDefinition)
.forEach(beanDefinition->{
//注册beanDefinition到beanDefinitionRegistry
BeanDefinitionReaderUtils.registerWithGeneratedName(beanDefinition,beanDefinitionRegistry);
});
}
}
EnableAccess注解变更
这里import导入了AccessImportBeanDefinitionRegistrar
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AccessImportBeanDefinitionRegistrar.class)
public@interfaceEnableAccess{
/**
*接入类型
*@return
*/
Access.Typetype();
}
实现
RPC接入
type=Access.Type.RPC
@SpringBootApplication
@EnableAccess(type=Access.Type.RPC)
publicclassDemoApplication{
publicstaticvoidmain(String[]args){
ConfigurableApplicationContextcontext=SpringApplication.run(DemoApplication.class,args);
Accessaccess=context.getBean(Access.class);
access.start();
access.stop();
}
}
REST接入
type=Access.Type.REST
@SpringBootApplication
@EnableAccess(type=Access.Type.REST)
publicclassDemoApplication{
publicstaticvoidmain(String[]args){
ConfigurableApplicationContextcontext=SpringApplication.run(DemoApplication.class,args);
Accessaccess=context.getBean(Access.class);
access.start();
access.stop();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。