SpringBoot根据注解动态执行类中的方法实现

 更新时间:2023年08月06日 09:53:47   作者:benben044  
本文主要介绍了SpringBoot根据注解动态执行类中的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

1、需求

有一个接口提供了xx的服务,有两个场景分别实现了xx的具体逻辑,标记为xx1和xx2。

然后场景一过来的时候执行xx1逻辑,场景二过来的时候执行xx2逻辑。

2、简单实现

定义一个service层,提供xx的接口。

然后定义两个serviceImpl,@Service(name="")标记不同的名称,分别提供xx的具体实现。

在使用时,通过@Resource(name="")注入两个组件。

接着硬编码,当场景一时调用组件1的xx方法,当场景二时调用组件2的xx方法。

这种方法可读性较高,逻辑也清晰,但是扩展性不高,硬编码的硬伤。

3、通过自定义注解的方式

(1)实现方案

首先,构造一个自定义注解@Extension,用于存放场景所需的信息。

其次,定义一个Service接口提供xx服务

然后,定义两个ServiceImpl类实现接口的xx服务,并且标记@Service注解。同时新增@Extension注解,输入场景信息。

接着,定义一个@PostConstruct方法,在方法中读取容器中所有带@Extension注解的示例,将注解的场景信息作为key,示例作为Object放入某个组件ExtRespository的Map中存起来。

最后,请求过来时解析场景信息,从ExtRespository的Map中读取实例信息,通过Function<T,R>函数式编程调用接口的xx方法。

(2)实现示例

1)Extension.java

自定义注解接口

/**
 * 自定义注解
 */
@Retention(RetentionPolicy.RUNTIME) // 作用于运行时
@Target(ElementType.TYPE)   // 作用于类上
@Component
public @interface Extension {
    String bizScene() default "defaultBizScene";
    String useCase() default "defaultUseCase";
}

2)Father.java

模拟Service接口

public interface Father {
    public String sayHello();
}

3)FatherOne.java

模拟ServiceImpl实现类1

@Component
@Extension(bizScene="test", useCase="one")
public class FatherOne implements Father {
    @Override
    public String sayHello() {
        System.out.println("测试: father1");
        return "father1";
    }
}

4)FatherTwo.java

模拟ServiceImpl实现类2

@Component
@Extension(bizScene="test", useCase="two")
public class FatherTwo implements Father{
    @Override
    public String sayHello() {
        System.out.println("测试: father2");
        return "father2";
    }
}

5)ExtInitiator.java

项目启动时的一部分初始化

@Component
public class ExtInitiator {
    @Autowired
    ExtRespository extRespository;
    @Autowired
    private ApplicationContext applicationContext;
    @PostConstruct
    public void init(){
        Map<String, Object> extensionBeans = applicationContext.getBeansWithAnnotation(Extension.class);
        for(Object bean : extensionBeans.values()){
            Class<?> extensionClz = ClassUtils.getUserClass(bean);
            Extension extension = AnnotationUtils.findAnnotation(extensionClz, Extension.class);
            String bizScene = extension.bizScene();
            String useCase = extension.useCase();
            extRespository.getExtRepository().put(bizScene + "_" + useCase, bean);
        }
    }
}

6)ExtRespository.java

组件提供map的存放

@Component
public class ExtRespository {
    private Map<String, Object> extRepository = new HashMap<>();
    public Map<String, Object> getExtRepository(){
        return extRepository;
    }
}

7)Test方法中测试

@Autowired
ExtRespository extRespository;
@Test
public void testExtension() {
    Function<Father, String> exeFunction = extention -> extention.sayHello();
    System.out.println("test_two场景下调用sayHello:" + exeFunction.apply((Father)extRespository.getExtRepository().get("test_two")));
}

运行测试方法时显示:

测试: father2
test_two场景下调用sayHello:father2

到此这篇关于SpringBoot根据注解动态执行类中的方法实现的文章就介绍到这了,更多相关SpringBoot 动态执行类中方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中HashMap 中的一个坑

    Java中HashMap 中的一个坑

    这篇文章主要介绍了Java中HashMap 中的一个坑,文章围绕主题展开详细的内容介绍,具有一定的参考价价值,需要的小伙伴可以参考一下
    2022-05-05
  • Java 在游戏中探索数组二维数组

    Java 在游戏中探索数组二维数组

    数组和二维数组感觉用王者荣耀的装备栏来举例解释,应该更易懂一些。从基础开始讲,后续会讲到JAVA高级,中间会穿插面试题和项目实战,希望能给大家带来帮助
    2022-03-03
  • java连接数据库增、删、改、查工具类

    java连接数据库增、删、改、查工具类

    这篇文章主要介绍了java连接数据库增、删、改、查工具类,需要的朋友可以参考下
    2014-05-05
  • SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

    SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

    本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数据库密码)进行加密,通过引入Jasypt依赖、配置加密密钥、加密敏感信息并测试解密功能,可以提高配置文件的安全性,减少因配置文件泄露导致的安全风险,感兴趣的朋友一起看看吧
    2025-03-03
  • Java中的System.arraycopy()浅复制方法详解

    Java中的System.arraycopy()浅复制方法详解

    这篇文章主要介绍了Java中的System.arraycopy()浅复制方法详解,Java数组的复制操作可以分为深度复制和浅度复制,简单来说深度复制,可以将对象的值和对象的内容复制;浅复制是指对对象引用的复制,需要的朋友可以参考下
    2023-11-11
  • 特殊数据结构之使用Java实现单调栈示例

    特殊数据结构之使用Java实现单调栈示例

    这篇文章主要为大家介绍了特殊数据结构之使用Java实现单调栈示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java中的ArrayList类常用方法和遍历

    Java中的ArrayList类常用方法和遍历

    这篇文章主要介绍了Java中的ArrayList类常用方法和遍历,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 如何使用CountDownLatch同步java多线程

    如何使用CountDownLatch同步java多线程

    这篇文章主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 常用的ResponseEntity.BodyBuilder和自定义ResponseEntity的实例

    常用的ResponseEntity.BodyBuilder和自定义ResponseEntity的实例

    这篇文章主要介绍了常用的ResponseEntity.BodyBuilder和自定义ResponseEntity的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring Boot使用Log4j2的实例代码

    Spring Boot使用Log4j2的实例代码

    这篇文章主要介绍了Spring Boot使用Log4j2的实例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论