我有一些简单任务的网络应用程序:
public class CustomTask {
private final Logger logger = LoggerFactory.getLogger(getClass());
@Inject
private CustomDao customDao;
@Override
@Transactional(propagation = Propagation.REQUIRED, timeout = 600)
public int run() {
customDao.doSomething();
}
}
现在它没有问题。但现在我想将BeanFactoryPostProcessor(implements BeanFactoryPostProcessor
)的实现添加到此任务并覆盖此方法:
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
logger.info(beanFactory.getClass() + "xxxxxxxxxx");
logger.info("The factory contains the followig beans:");
String[] beanNames = beanFactory.getBeanDefinitionNames();
for (int i = 0; i < beanNames.length; ++i)
logger.info(beanNames[i]);
}
但现在我想用customDao
做一些事情它抛出NullPointException
而我不知道为什么因为在记录器中我看到这个bean被注册了。你能解释一下为什么会发生这种异常以及我该如何解决它?
答案 0 :(得分:4)
这不起作用,因为@Inject
检测到@Autowired
(就像AutowiredAnnotationBeanPostProcessor
)BeanPostProcessor
BeanFactoryPostProcessor
。 @Inject
在应用程序上下文中的任何其他bean之前被实例化。因此,在创建后期处理器时,甚至不会创建检测public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.customDao = beanFactory.getBean(CustomDao.class);
}
注释的基础结构,也不能对您的Bean工厂后处理器执行操作。
请参阅api docs for Autowired annotation,其中有关于BeanFactoryPostProcessors限制的说明。
你可以让你的任务实现BeanFactoryAware并自己注入bean:
{{1}}