实现BeanFactoryPostProcessor时为什么@Inject不起作用

时间:2014-05-21 12:44:51

标签: spring

我有一些简单任务的网络应用程序:

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被注册了。你能解释一下为什么会发生这种异常以及我该如何解决它?

1 个答案:

答案 0 :(得分:4)

这不起作用,因为@Inject检测到@Autowired(就像AutowiredAnnotationBeanPostProcessorBeanPostProcessor 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}}