1

我正在尝试编写一个面向服务的应用程序。

我被称为memory这样定义:

package com.example.assets;

//imports ignored

@Resource
public class Memory {
}

我有一个服务被memoryHandler定义为:

package com.example.service;

//imports ignored

@Service
public class MemoryHandler {

    @Autowired
    private Memory memory;

    public void execute() {
        //do something with memory
    }
}

还有另一个类,它是BeanFactoryPostProcessor

package com.example.service;

//imports ignored

@Component
public class PostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        beanFactory.getBeansOfType(MemoryHandler.class, false, true);
    }
}

它过早地查找 bean,memoryHandler使其实例化`但没有自动装配。但是,我希望 bean 在工厂获取之前自动装配。

在我的主要课程中,我写过:

package com.example.service;

//imports ignored

public class Main {

    public static void main(String[] args) {
        final ApplicationContext context = new ClassPathXmlApplicationContext("/context.xml");
        context.getBean(MemoryHandler.class).execute();
    }

}

我得到了NullPointerException一条我使用内存的线路。我用 setter 注入替换了上面的声明,并且在跟踪时意识到注入永远不会发生。

我已将两个组件上的注释更改为Service, Repository,Component并且还尝试替换AutowiredwithResource无济于事。

我在这里想念什么?我已经阅读了在寻找答案时出现的所有问题,但没有一个对我有帮助(我得到了关于在Resouce那里使用注释的提示)。

不用说,我没有错过我的 bean 的注释配置:

<context:annotation-config/>
<context:component-scan base-package="com.example"/>

此外,当在 XML 配置文件中定义自动装配的 bean 时,自动装配工作得很好,而不是通过注释。

我正在使用 Spring 3.2.3.RELEASE。

4

1 回答 1

1

改变 PostProcessor 的实现是关键:

代替:

public class PostProcessor implements BeanFactoryPostProcessor {

我将不得不写:

public class PostProcessor implements ApplicationContextAware {

这确保了上下文在后处理之前将被完全填充,在我的情况下它工作得很好。但我想知道是否有另一种方法可以做到这一点,使用通常的BeanFactoryPostProcessor界面?

于 2013-10-05T08:40:38.113 回答