SpringBoot获取自定义注解属性-类-方法

SpringBoot获取自定义注解属性-类-方法

写了个自定义注解,想获取自定义注解的属性,或者标在方法上的注解上的属性

获取自定义注解在类上的属性值
	 //获取自定义注解的配置的所有bean
    final Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(EnableRetryRabbitMq.class);
    for (String key : beansWithAnnotation.keySet()) {
      String scanPackage = "com.pkk";
      //获取指定bean的注解为EnableRetryRabbitMq.class的注解属性
      final EnableRetryRabbitMq annotation = AnnotationUtils.findAnnotation(beansWithAnnotation.get(key).getClass(), EnableRetryRabbitMq.class);
      if (null != annotation && StringUtils.isNotBlank(annotation.scanBasePackages())) {
        scanPackage = annotation.scanBasePackages();
      }
      //注入bean(自己封装的方法,详情看下面)
      RetrySpringUtil.handleRegisterBeanWithSpringToInitConfigurerationBean(applicationContext);
    }



-- 说明
	①:applicationContext是ApplicationContent,可以通过实现ApplicationContextAware来获取
获取自定义注解在方法上的属性值
**
   * @Description: 处理并注册bean
   * @Param: [applicationContext, scanPackage]
   * @return: void
   * @Author: pkk
   * @Date: 2019/9/6 0006 下午 1:35
   */
  public static void handleRegisterBeanWithSpringToInitConfigurerationBean(ApplicationContext applicationContext) {
    //获取自定义注解的配置
    final Map<String, Object> beansWithAnnotation = applicationContext.getBeansWithAnnotation(InitRetryRabbitMq.class);
    for (String key : beansWithAnnotation.keySet()) {
      //Spring 代理类导致Method无法获取,这里使用AopUtils.getTargetClass()方法
      Method[] methods = ReflectionUtils.getAllDeclaredMethods(AopUtils.getTargetClass(beansWithAnnotation.get(key).getClass()));
      for (Method method : methods) {
        //获取指定方法上的注解的属性
        final InitRetryRabbitMq initRetryRabbitMq = AnnotationUtils.findAnnotation(method, InitRetryRabbitMq.class);
        if (null != initRetryRabbitMq) {
          //验证必要的注解的属性
          String queueName = Optional.ofNullable(initRetryRabbitMq.queueName()).orElseThrow(() -> new IllegalArgumentException("Please specify the queue name of the queue!"));

          //多个bean的时候相当于起个别名
          String registerBean = queueName + "InitConfigurerationBean";

          //将bean注册到Spring容器中,通过构造函数的方式进行注入
          SpringRegisterBean.registerBean((ConfigurableApplicationContext) applicationContext, registerBean, InitConfigurerationBean.class, initRetryRabbitMq, applicationContext);
          log.info("The registration bean is " + registerBean + ",Configuration information is " + JSONObject.toJSONString(initRetryRabbitMq));
        }
      }
    }
  }
将bean手动注入到Spring中

采用BeanDefinitionBuilder(bean定义构造器)使用构造函数的方式注入bean

/**
   * 主动向Spring容器中注册bean
   *
   * @param applicationContext Spring容器
   * @param beanName BeanName
   * @param registerBeanClazz 将要注册的bean的类
   * @param args 构造方法的必要参数,顺序和类型要求和clazz中定义的一致
   * @return 返回注册到容器中的bean对象
   */
  public static <T> T registerBean(ConfigurableApplicationContext applicationContext, String beanName, Class<T> registerBeanClazz,
      Object... args) {
    //容器中是否已经包含此bean
    if (applicationContext.containsBean(beanName)) {
      Object bean = applicationContext.getBean(beanName);

      //的类或接口是否相同,或是否是其超类或超接口。如果是则返回 true;否则返回 false。如果该 Class 表示一个基本类型,且指定的 Class 参数正是该 Class 对象,则该方法返回 true;否则返回 false
      if (bean.getClass().isAssignableFrom(registerBeanClazz)) {
        return (T) bean;
      } else {
        throw new RuntimeException("BeanName 重复 " + beanName);
      }
    }

    //Spring的bean的定义构造器
    BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(registerBeanClazz);
    //给要注册的bean设置构造函数相应的参数,注意,顺序要相同
    for (Object arg : args) {
      beanDefinitionBuilder.addConstructorArgValue(arg);
    }
    //获取原始的bean
    BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
    //获取bean定义注册的工厂
    BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
    //开启注册bean到Sring容器中
    beanFactory.registerBeanDefinition(beanName, beanDefinition);
    return applicationContext.getBean(beanName, registerBeanClazz);
  }

bean的初始化操作

package com.pkk.log.web.configure;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

/**
 * @description: bean创建之后的操作, 会调用postProcessAfterInitialization
 * @author: peikunkun
 * @create: 2019-09-04 17:19
 **/
@Slf4j
@Component
public class BeanCreateProcessor implements BeanPostProcessor {

  /**
   * @Description: bean初始化之前的曹组
   * @Param: [bean, beanName]
   * @return: java.lang.Object
   * @Author: peikunkun
   * @Date: 2019/9/6 0006 下午 3:10
   */
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    log.info("bean ->" + beanName + "初始化之前的操作");
    return bean;
  }

  /**
   * @Description: bean创建之后的操作
   * @Param: [bean, beanName]
   * @return: java.lang.Object
   * @Author: peikunkun
   * @Date: 2019/9/4 0004 下午 5:42
   */
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    log.info("bean ->" + beanName + "初始化之后的操作");
    return bean;
  }
}


@Slf4j
@Component
class InitializingBeanTest implements InitializingBean {


  public void init() {
    System.out.println("init-method is called");
  }


  @Override
  public void afterPropertiesSet() throws Exception {
    System.out.println("afterPropertiesSet-method is called");
  }
}


class mainTest {
  public static void main(String[] args) {
    System.out.println("执行顺序:\n" +
        "afterPropertiesSet 和init-method之间的执行顺序是afterPropertiesSet 先执行,init-method 后执行。\n" +
        "从BeanPostProcessor的作用,可以看出最先执行的是postProcessBeforeInitialization,然后是afterPropertiesSet,"
        + "然后是init-method,然后是postProcessAfterInitialization。");
  }
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中实现自定义注解脱敏,可以按照以下步骤进行操作: 1. 创建一个自定义注解,在该上使用`@Target`、`@Retention`等元注解进行注解的定义。注解中可以包含一些属性,用来指定脱敏的方式或型。 引用 2. 在需要进行脱敏的字段上,使用刚刚定义的自定义注解进行标记。可以在实体的字段上加上该注解,或者在需要脱敏的方法上加上该注解。 引用 3. 创建一个拦截器或者切面,在请求进入时,通过反射机制获取到带有自定义注解的字段,并对其进行脱敏处理。脱敏的方式可以根据注解中指定的型来进行处理。 引用 4. 在Spring Boot的配置文件(例如application.yml)中配置相关信息,如服务器端口、数据库连接信息等。 引用 通过以上步骤,就可以在Spring Boot项目中实现自定义注解脱敏的功能了。自定义注解可以帮助我们标记需要脱敏的字段,然后在拦截器或切面中实现脱敏逻辑,保护敏感数据的安全性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [springboot 自定义注解实现数据脱敏](https://blog.csdn.net/a2365900668/article/details/120306728)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值