springboot获取所有带指定标签的⽅法
springboot aop之前有⼀个需求 写⼀个⾃定义注解,然后在项⽬启动以后获取到所有带⾃定义注解的⽅法,然后进⾏业务分析,查了很多资料,但发现很多不全⾯,所以⾃⼰记录⼀下
实现ApplicationContextAware和ApplicationListener
之所以ApplicationContextAware和ApplicationListener都需要实现是因为我发现有时候只实现其中⼀个⽆法得到想要的结果,接下来细说。
public class TestListener implements ApplicationContextAware, ApplicationListener<ContextRefreshedEvent>{
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext)throws BeansException {
this.applicationContext = applicationContext;
}
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent){
getAnnotationMap(applicationContext);
}
}
通过重写setApplicationContext⽅法获取applicationContext以便之后获取相关bean。
之前由博客说可以在重写onApplicationEvent⽅法中通过ContextRefreshedEvent 获得root节点的applicationContext,但是我试过之后在我的情境中⽆法获得root节点,可能和项⽬环境有关。
public void onApplicationEvent(ContextRefreshedEvent event){
// 根容器为Spring容器
ApplicationContext().getParent()==null){
Map<String,Object> beans = ApplicationContext().getBeansWithAnnotation(IMobile.class);
for(Object bean:beans.values()){
}
}
}
因为ApplicationContextAware的setApplicationContext⽅法不⼀定是在所有bean初始化完成后实现的,所以我在onApplicationEvent ⽅法中调⽤⾃定义⽅法,确保此时所有bean都已经初始化完毕。
通过反射获取具体注解
获取到bean以后可以通过反射获取class对象来获取指定注解
Class<?> clazz = Class();
Method[] ms = Methods();
for(Method m:ms){
Service service= 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 setApplicationContext(ApplicationContext applicationContext)throws BeansException {
this.applicationContext = applicationContext;
}
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.isAnnotationPresent(Service.class)){
Service service = Annotation(Service.class);
// 业务操作
}
}
});
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论