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

时间:2025-03-19 22:10:46

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

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

获取自定义注解在类上的属性值
	 //获取自定义注解的配置的所有bean
    final Map<String, Object> beansWithAnnotation = ();
    for (String key : ()) {
      String scanPackage = "";
      //获取指定bean的注解为的注解属性
      final EnableRetryRabbitMq annotation = ((key).getClass(), );
      if (null != annotation && (())) {
        scanPackage = ();
      }
      //注入bean(自己封装的方法,详情看下面)
      (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 = ();
    for (String key : ()) {
      //Spring 代理类导致Method无法获取,这里使用()方法
      Method[] methods = (((key).getClass()));
      for (Method method : methods) {
        //获取指定方法上的注解的属性
        final InitRetryRabbitMq initRetryRabbitMq = (method, );
        if (null != initRetryRabbitMq) {
          //验证必要的注解的属性
          String queueName = (()).orElseThrow(() -> new IllegalArgumentException("Please specify the queue name of the queue!"));

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

          //将bean注册到Spring容器中,通过构造函数的方式进行注入
          ((ConfigurableApplicationContext) applicationContext, registerBean, , initRetryRabbitMq, applicationContext);
          ("The registration bean is " + registerBean + ",Configuration information is " + (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 ((beanName)) {
      Object bean = (beanName);

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

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

bean的初始化操作

package ;

import .slf4j.Slf4j;
import ;
import ;
import ;
import ;

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

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

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


@Slf4j
@Component
class InitializingBeanTest implements InitializingBean {


  public void init() {
    ("init-method is called");
  }


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


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