栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Springboot基于enable模块驱动的实现

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Springboot基于enable模块驱动的实现

enable作为模块驱动在Spring Farmework、Spring Boot、Spring Cloud使用,都是通过注解的形式以@enable作为前缀,一些常用注解如

框架 注解 模块
Spring framework @EnableWebMvc Web MVC模块
Spring framework @EnableTransactionmanagement Web MVC模块
Spring framework @EnableCacheing Cacheing模块
Spring framework @EnableMBeanExport JMX模块
Spring framework @EnableWebFlux Web Flux模块
Spring framework @EnableAspectJAutoProxy AspectJ模块
Spring Boot @EnableAutoConfiguration 自动装配模块
Spring Boot @EnableWebManagementContext Actuator模块
Spring Boot @EnableConfigurationProperties 配置属性绑定模块
Spring Boot @EnableOauth2Sso OAuth2单独登录模块
Spring Cloud @EnableEurekaServer eureka服务模块
Spring Cloud @EnableConfigServer 配置服务器模块
Spring Cloud @EnableFeignClients Feign客户端模块
Spring Cloud @EnableZuulProxy 服务网关zuul模块
Spring Cloud @EnableCircuitBreaker 服务熔断模块

如何自定义enable开发?

基于importSelector实现注解驱动

自定义接入类型

Access为接入类型的接口,下文的RPC接入和REST接入基于这个实现,定义两个接口,一个为启动,一个停止,内部嵌套一个枚举用于标识是哪一种接入

public interface Access {
  
  void start();

  
  void stop();

  enum Type{
    REST,
    RPC
  }
}

定义RPC和REST的实现

REST实现,只是简单的打印方法

public class RestAccess implements Access{
  @Override
  public void start() {
    System.out.println("rest接入配置");
  }

  @Override
  public void stop() {
    System.out.println("rest接入销毁配置");
  }
}

RPC实现

public class RpcAccess implements Access{
  @Override
  public void start() {
    System.out.println("rpc接入配置");
  }

  @Override
  public void stop() {
    System.out.println("rpc接入销毁配置");
  }
}

自定义注解EnableAccess

接入类型为RPC或者REST,AccessimportSelector在下一步骤实现

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
@Inherited
@import(AccessimportSelector.class)
public @interface EnableAccess {
  
  Access.Type type();
}

实现importSelector

定义AccessimportSelector实现importSelector,分别获取注解信息,根据注解获取接入类型,根据接入类型选择不同的接入类型

public class AccessimportSelector implements importSelector{
  @Override
  public String[] selectimports(Annotationmetadata annotationmetadata) {
    //读取EnableAccess中所有的属性方法
    Map annotationAttributes = annotationmetadata.getAnnotationAttributes(EnableAccess.class.getName());
    //获取属性为type的属性方法
    Access.Type type = (Access.Type )annotationAttributes.get("type");
    //导入的类名称数组
    String [] importClassName = new String[0];
    switch (type){
      case RPC:
 //设置为RPC,返回RpcAccess组件
 importClassName = new String[]{RpcAccess.class.getName()};
 break;
      case REST:
 //设置为REST,返回RestAccess组件
 importClassName = new String[]{RestAccess.class.getName()};
    }
    return importClassName;
  }
}

使用

在primarySource也就是这里的DemoApplication上使用注解EnableAccess,选择接入方式,就会初始化不通的接入组件

@SpringBootApplication
@EnableAccess(type=Access.Type.REST)
public class DemoApplication {

  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
    Access access = context.getBean(Access.class);
    access.start();
    access.stop();
  }

}

基于importBeanDefinitionRegistrar实现注解驱动

这里其它步骤一样,主要区别是注解里面import的类变了,这里是基于基于importBeanDefinitionRegistrar实现注解驱动实现

自定义importBeanDefinitionRegistrar

public class AccessimportBeanDefinitionRegistrar implements importBeanDefinitionRegistrar {
  @Override
  public void registerBeanDefinitions(Annotationmetadata annotationmetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
    importSelector importSelector = new AccessimportSelector();
    //筛选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 @interface EnableAccess {
  
  Access.Type type();
}

实现

RPC接入

type=Access.Type.RPC

@SpringBootApplication
@EnableAccess(type=Access.Type.RPC)
public class DemoApplication {

  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
    Access access = context.getBean(Access.class);
    access.start();
    access.stop();
  }

}

REST接入

type=Access.Type.REST

@SpringBootApplication
@EnableAccess(type=Access.Type.REST)
public class DemoApplication {

  public static void main(String[] args) {
    ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);
    Access access = context.getBean(Access.class);
    access.start();
    access.stop();
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/137133.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号