spring自定义注解扫描导致自动注入失效的问题

1.最初的代码编写方式
//---------------------以下方式会导致被扫描类无法注入bean----------------------------
// Map annotationMap = beanFactory.getBeansWithAnnotation(ExcuteTag.class);
// Set set = annotationMap.keySet();
// Iterator it = set.iterator();
// while(it.hasNext()) {
// String netxtKey = it.next();
// Object obj = annotationMap.get(netxtKey);
// Method[] methods = obj.getClass().getDeclaredMethods();
// for (Method method2 : methods) {
// if(method2.getAnnotation(ExcuteTag.class)!=null) {
// ExcuteTag e = (ExcuteTag) method2.getAnnotation(ExcuteTag.class);
// //将任务注解内容加入静态list供初始化事件调用并入库
// }
// }
// }
以上代码编写方式导致被扫描类在spring容器启动后所有自动注入的对象失效的问题,通过跟踪源码之后发现,在扫描的时候调用了类getbean方法之后自动注入失效。一直想要弄明白为什么调用getbean之后导致了自动注入失效的问题,奈何能力有限未找到源头。。但问题需要解决,所以换了个思路解决该问题。
2.修改后的代码编写方式
String[] strArr = beanFactory.getBeanNamesForAnnotation(ExcuteTag.class);
for (String string : strArr) {
try {
Method[] methods = Class.forName(beanFactory.getBeanDefinition(string).getBeanClassName()).getDeclaredMethods();
for (Method method2 : methods) {
if(method2.getAnnotation(ExcuteTag.class)!=null) {
if(anexcuteList==null) {
anexcuteList = new ArrayList();
}
ExcuteTag e = (ExcuteTag) method2.getAnnotation(ExcuteTag.class);
//将任务注解内容加入静态list供初始化事件调用并入库
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
将代码编写方式修改为上述方式后,自动注入失效问题解决。。
解决思路为:既然是因为调用getbean导致自动注入的问题失效,那我是不是可以考虑换另外一种方式来获得对象实例。
所以将beanFactory.getBeansWithAnnotation(ExcuteTag.class);(该方法内部调用了getbean方法)换成了先通过String[] strArr = beanFactory.getBeanNamesForAnnotation(ExcuteTag.class);获得自定义注解类名,再通过Class.forName(beanFactory.getBeanDefinition(string).getBeanClassName())获得对应类的实例。。通过上述修改后自动失效问题被解决,但是为什么会出现该问题依然不甚明白,希望前辈们能够解惑。

你可能感兴趣的:(异常解决)