springboot获取所有带指定标签的⽅法
之前有⼀个需求 写⼀个⾃定义注解,然后在项⽬启动以后获取到所有带⾃定义注解的⽅法,然后进⾏业务分析,查了很多资料,但发现很多不全⾯,所以⾃⼰记录⼀下
实现ApplicationContextAware和ApplicationListener
之所以ApplicationContextAware和ApplicationListener都需要实现是因为我发现有时候只实现其中⼀个⽆法得到想要的结果,接下来细说。
public class TestListener implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>{
private ApplicationContext applicationContext;
public void tApplicationContext(ApplicationContext applicationContext)throws BeansException {
this.applicationContext = applicationContext;
}
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent){
getAnnotationMap(applicationContext);
匍匐怎么读}
}
通过重写tApplicationContext⽅法获取applicationContext以便之后获取相关bean。
之前由博客说可以在重写onApplicationEvent⽅法中通过ContextRefreshedEvent 获得root节点的applicationContext,但是我试过之后在我的情境中⽆法获得root节点,可能和项⽬环境有关。
public void onApplicationEvent(ContextRefreshedEvent event){
// 根容器为Spring容器
ApplicationContext().getParent()==null){
Map<String,Object> beans = ApplicationContext().getBeansWithAnnotation(IMobile.class);wink是什么意思
for(Object bean:beans.values()){
}
rachel roxxx
}
永不放弃英语
}拥有英文
因为ApplicationContextAware的tApplicationContext⽅法不⼀定是在所有bean初始化完成后实现的,所以我在onApplicationEvent ⽅法中调⽤⾃定义⽅法,确保此时所有bean都已经初始化完毕。
通过反射获取具体注解
获取到bean以后可以通过反射获取class对象来获取指定注解
Class<?> clazz = Class();
五月英语Method[] ms = Methods();
for(Method m:ms){
Service rvice= m.getAnnotation(Service.class);
}
但是这样会有⼀个问题,因为当bean被代理后,像是加了事务,此时获取到的class是代理类,⽆法获得到源类上的注解属性,所以获得注解的为空
此时需要使⽤aop⼯具类进⾏class⽂件获取
Class clazz = TargetClass(value);
Method[] methods = AllDeclaredMethods(clazz);
这样获取到class对象和method⽅法对象中都可以拿到源类上的注解属性。与人沟通的技巧
整体代码
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.BeansException;
import t.ApplicationContext;
import t.ApplicationContextAware;
import t.ApplicationListener;
import t.event.ContextRefreshedEvent;
import org.springframework.stereotype.Service;
import org.springframework.util.ReflectionUtils;
import flect.Method;
import java.util.Map;
public class TestListener implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>{ private ApplicationContext applicationContext;
全国统考 单独考试public void tApplicationContext(ApplicationContext applicationContext)throws BeansException {
this.applicationContext = applicationContext;
}i d
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent){
getAnnotationMap(applicationContext);
}
public void getAnnotationMap(ApplicationContext applicationContext){
Map<String, Object> beansWithAnnotationMap =this.applicationContext.
getBeansWithAnnotation(Service.class);
beansWithAnnotationMap.values().forEach(value ->{
Class clazz = TargetClass(value);
Method[] methods = AllDeclaredMethods(clazz);
for(Method method:methods){
if(method.isAnnotationPrent(Service.class)){
Service rvice = Annotation(Service.class);
// 业务操作
}
}
});
}
}