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);
});
}
}
07-20
2359
09-28
540
03-26
119
08-15
451
03-09
1839