Spring Boot使用BeanPostProcessor和ApplicationContextAware获取到注解类


import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import org.example.common.annotation.Demo;
import org.example.common.annotation.DemoMethod;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;

import java.lang.reflect.Method;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
@Component
public class DemoBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {

    private static ApplicationContext applicationContext;

    private static Map<String,Method> concurrentHashMap=new ConcurrentHashMap<>();

    private static Map<String,Class<?>> concurrentHashMapClass=new ConcurrentHashMap<>();

    @Override
    @SneakyThrows
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        Class<?> clazz=bean.getClass();
        Demo demo=clazz.getAnnotation(Demo.class);
        if(demo!=null){
            log.info("添加注解Demo类名称:"+beanName);

           Method[] methods=clazz.getDeclaredMethods();
           for(Method method:methods){
               DemoMethod demoMethod=method.getAnnotation(DemoMethod.class);
               log.info("添加注解DemoMethod类名称:"+method.getName());
               if(demoMethod!=null){
                   String key=demo.value()+demoMethod.value();
                   if(concurrentHashMap.containsKey(key)){
                       throw new RuntimeException("路径重复");
                   }
                   concurrentHashMap.put(key,method);
                   concurrentHashMapClass.put(key,clazz);
               }

           }
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    public static Method get(String url){
        return concurrentHashMap.get(url);
    }

    public static Class<?> getClass(String url){
        return concurrentHashMapClass.get(url);
    }



    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        DemoBeanPostProcessor.applicationContext = applicationContext;
        Map<String,Object> map= applicationContext.getBeansWithAnnotation(RestController.class);
        map.forEach((key,value)->{
            System.out.println("拿到controller:"+key+",拿到value:"+value);
            Class<?> aClass = AopUtils.getTargetClass(value);
            System.out.println("类的包名称{}"+aClass.getPackage().getName());
            System.out.println("拿到Class:"+aClass);
        });
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值