iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >springboot动态加入注解怎么实现
  • 742
分享到

springboot动态加入注解怎么实现

springboot 2023-09-26 21:09:11 742人浏览 薄情痞子
摘要

要在Spring Boot中动态加入注解,可以使用Java的动态代理技术和反射机制。以下是一个示例代码,演示如何在运行时动态加入注解

要在Spring Boot中动态加入注解,可以使用Java的动态代理技术和反射机制。以下是一个示例代码,演示如何在运行时动态加入注解:
```java
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationBeanNameGenerator;
import org.springframework.context.annotation.ClassPathScanninGCandidateComponentProvider;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.WEB.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashSet;
import java.util.Set;
public class DynamicAnnotationExample {
public static void main(String[] args) {
// 获取所有带有@Controller注解的类
Set> controllerClasses = getClassesWithAnnotation(Controller.class);
// 动态加入@GetMapping注解到所有方法上
for (Class controllerClass : controllerClasses) {
addGetMappingAnnotation(controllerClass);
}
}
private static Set> getClassesWithAnnotation(Class annotationClass) {
Set> classes = new HashSet<>();
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AnnotationTypeFilter(annotationClass));
for (BeanDefinition beanDefinition : provider.findCandidateComponents("com.example")) {
try {
Class clazz = Class.forName(beanDefinition.getBeanClassName());
classes.add(clazz);
} catch (Exception e) {
e.printStackTrace();
}
}
return classes;
}
private static void addGetMappingAnnotation(Class controllerClass) {
Object controllerProxy = Proxy.newProxyInstance(
controllerClass.getClassLoader(),
new Class[]{controllerClass},
(proxy, method, args) -> {
// 动态加入@GetMapping注解到方法上
AnnotationMetadata annotationMetadata = new AnnotationMetadata() {
@Override
public Set getAnnotationTypes() {
return Set.of(GetMapping.class.getName());
}
@Override
public Set getMetaAnnotationTypes(String annotationName) {
return null;
}
@Override
public boolean hasAnnotation(String annotationName) {
return GetMapping.class.getName().equals(annotationName);
}
@Override
public boolean hasMetaAnnotation(String metaAnnotationName) {
return false;
}
@Override
public boolean isAnnotated(String annotationName) {
return GetMapping.class.getName().equals(annotationName);
}
@Override
public Map getAnnotationAttributes(String annotationName) {
return Map.of("value", new String[]{"/dynamic"});
}
@Override
public Map getAnnotationAttributes(String annotationName, boolean classValuesAsString) {
return null;
}
};
Method proxyMethod = Proxy.class.getDeclaredMethod("proxyMethod", Method.class);
proxyMethod.setAccessible(true);
Method realMethod = (Method) proxyMethod.invoke(proxy, method);
Method dynamicMethod = new DynamicMethod(realMethod, annotationMetadata);
return dynamicMethod.invoke(proxy, args);
});
// 替换原有的Controller Bean
AnnotationBeanNameGenerator generator = new AnnotationBeanNameGenerator();
String beanName = generator.generateBeanName(controllerClass, null);
SpringContextHolder.replaceBean(controllerClass, beanName, controllerProxy);
}
// 动态代理中用于替换原有方法的动态方法
private static class DynamicMethod extends Method {
private final AnnotationMetadata annotationMetadata;
public DynamicMethod(Method method, AnnotationMetadata annotationMetadata) {
super(
method.getName(),
method.getParameterTypes(),
method.getReturnType(),
method.getExceptionTypes(),
method.getModifiers(),
method.getDeclaringClass(),
method.getDefaultValue()
);
this.annotationMetadata = annotationMetadata;
}
@Override
public T getAnnotation(Class annotationClass) {
return annotationMetadata.isAnnotated(annotationClass.getName()) ? annotationMetadata.getAnnotationAttributes(annotationClass.getName()) : super.getAnnotation(annotationClass);
}
@Override
public Annotation[] getAnnotations() {
Annotation[] annotations = super.getAnnotations();
Map attributes = annotationMetadata.getAnnotationAttributes(Controller.class.getName());
List result = new ArrayList<>(Arrays.asList(annotations));
result.add(createGetMappingAnnotation(attributes));
return result.toArray(new Annotation[0]);
}
private Annotation createGetMappingAnnotation(Map attributes) {
return new GetMapping() {
@Override
public Class annotationType() {
return GetMapping.class;
}
@Override
public String[] value() {

--结束END--

本文标题: springboot动态加入注解怎么实现

本文链接: https://www.lsjlt.com/news/418908.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot动态加入注解怎么实现
    要在Spring Boot中动态加入注解,可以使用Java的动态代理技术和反射机制。以下是一个示例代码,演示如何在运行时动态加入注解...
    99+
    2023-09-26
    springboot
  • springboot动态加载类怎么实现
    要实现Spring Boot动态加载类,可以使用以下步骤: 创建一个ClassLoader对象,用于动态加载类。可以使用URLC...
    99+
    2023-10-25
    springboot
  • springboot怎么手动动态注入controller和service
    这篇文章主要介绍“springboot怎么手动动态注入controller和service”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springboot怎么手动动态注入controller和se...
    99+
    2023-06-29
  • Springboot使用@RefreshScope注解实现配置文件的动态加载
    目录pom.xmlproperties启动类配置类controller打包springcloud对应的springboot版本参考:spring-boot-starter-actua...
    99+
    2024-04-02
  • Springboot自动装配之注入DispatcherServlet怎么实现
    这篇文章主要介绍“Springboot自动装配之注入DispatcherServlet怎么实现”,在日常操作中,相信很多人在Springboot自动装配之注入DispatcherServlet怎么实现问题上存在疑惑,小编查阅了各式资料,整理...
    99+
    2023-06-30
  • springboot+dynamicDataSource怎么实现动态添加切换数据源
    今天小编给大家分享一下springboot+dynamicDataSource怎么实现动态添加切换数据源的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,...
    99+
    2023-06-26
  • Mybatis在注解上怎么实现动态SQL
    本文小编为大家详细介绍“Mybatis在注解上怎么实现动态SQL”,内容详细,步骤清晰,细节处理妥当,希望这篇“Mybatis在注解上怎么实现动态SQL”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在注解上实现动...
    99+
    2023-07-02
  • springboot手动动态注入controller和service方式
    目录手动动态注入controller和service在controller中使用参数说明手动动态注入controller和service package test; import o...
    99+
    2024-04-02
  • 怎么用SpringBoot实现动态添加定时任务功能
    这篇“怎么用SpringBoot实现动态添加定时任务功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么用SpringBo...
    99+
    2023-06-29
  • SpringBoot通过@Value实现给静态变量注入值详解
    目录一、简介二、@Value给静态变量注入值方案一方案二三、总结一、简介 SpringBoot 中给普通变量注入值只需在变量上添加 @Value 注解即可。 application....
    99+
    2024-04-02
  • 怎么使用@PathVariable注解实现动态传值
    本篇内容主要讲解“怎么使用@PathVariable注解实现动态传值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用@PathVariable注解实现动态传值”吧!@PathVariabl...
    99+
    2023-06-25
  • 使用Springboot根据配置文件动态注入接口实现类
    Springboot根据配置文件动态注入接口实现类 需求 最近在做一个Springboot项目,需要面向不同需求的客户,但是为了方便管理分支,需要将不同客户的需求都写到同一套代码中,...
    99+
    2024-04-02
  • Android中怎么实现动态注册
    这期内容当中小编将会给大家带来有关Android中怎么实现动态注册,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。第一种写法:首先新建一个Java类,通过"New/Other/Broadcast ...
    99+
    2023-06-04
  • SpringBoot通过自定义注解实现配置类的自动注入的实现
    目录前言实现思路自定义配置类读取配置自定义注解创建子配置Bean通过反射进行people bean的注入使用效果回顾延伸前言 SpringBoot中通过@ConfigurationP...
    99+
    2023-05-16
    SpringBoot配置类自动注入 SpringBoot 自动注入
  • AngularJS怎么实现动态添加Option
    这篇文章主要为大家展示了“AngularJS怎么实现动态添加Option”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“AngularJS怎么实现动态添加Opti...
    99+
    2024-04-02
  • SpringBoot使用Shiro实现动态加载权限详解流程
    目录一、序章二、SpringBoot集成Shiro1、引入相关maven依赖2、自定义Realm3、Shiro配置类三、shiro动态加载权限处理方法四、shiro中自定义角色与权限...
    99+
    2024-04-02
  • SpringBoot 实现动态添加定时任务功能
    目录代码结构1. 配置类2. 定时任务类型枚举3. 实际执行任务实现类4. 定时任务包装器5. 任务注册器 (核心)6. 使用最后最近的需求有一个自动发布的功能, 需要做到每次提交都...
    99+
    2024-04-02
  • SpringBoot实现MapperScan添加动态配置(占位符)
    目录MapperScan添加动态配置(占位符)MapperScannerRegistrard的核心代码如下从上面代码中可以看出关于@MapperScan配置问题解决方案MapperS...
    99+
    2024-04-02
  • java中怎么实现动态载入
    java中怎么实现动态载入,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java动态载入class的两种方式:implicit隐式,即利用实例化才载入的特性来java动态载...
    99+
    2023-06-17
  • SpringBoot使用@Value实现给静态变量注入值
    SpringBoot中使用@Value()只能给普通变量注入值,不能直接给静态变量赋值 例如 application-dev.properties 配置文件有如下配置: 给普通变量...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作