所以现在为什么我的bean为null?

时间:2010-11-29 18:41:47

标签: java spring dependency-injection

我最近问过this question关于从applicationContext中提取bean的问题。答案确实很有帮助,但现在看来我从测试之外的类访问这个bean时遇到了问题。换句话说,我的测试实例化了一个使用来自应用程序上下文的bean的类,但是这个bean一直是null。

我的测试设置了这样的应用程序上下文:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/applicationContext-test.xml")
public class SearcherTests {

我的测试以编程方式实例化Repository类:

    Repository searcher = new Repository();

My Repository类具有以下成员变量:

 @Resource
 private MyFactory myFactory;

如果我正确理解Spring,那么应该查看名为myFactory的bean的当前应用程序上下文。根据测试,当前的应用程序上下文应为applicationContext-test.xml,其中包含myFactory的定义:

 <bean id="myFactory" 
    name="myFactory" 
    class="com.foo.Mocks"
    factory-method="createMockFactory" />

将来,这个工厂方法将返回一个模拟。但目前,它只返回一个常规Factory对象:

public class Mocks {

 public static MyFactory createMockFactory() {
  return new MyFactory();
 }
}

当我从浏览器运行应用程序时,myFactory变量已从applicationContext.xml中的bean定义中正确实例化。在我的测试中,为了确保我的applicationContext-test.xml正在工作,我将这个相同的bean列为成员变量,就像我在Repository类中一样。在运行测试时,包含测试的文件中的myFactory变量看起来与我期望的完全一样。但是,当我到达Repository类时,该类中的myFactory变量为null。似乎这个类没有基于myFactory中的bean定义来实例化applicationContext-test.xml变量。有人可以告诉我为什么吗?

更新

我更改了searcher变量,使其成为Spring bean,而不是手动实例化Repository类,现在myFactory变量已填入Repository }类。有人可以解释为什么这需要是一个bean来工作吗?

1 个答案:

答案 0 :(得分:3)

如果您自己实例化Repository,那么Spring不会介入,并且不会注入依赖项。它不会神奇地发生,Spring必须以某种方式处于循环中 - 实例必须通过Spring处理层传递,并且直接实例化会阻止它。