我最近问过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来工作吗?
答案 0 :(得分:3)
如果您自己实例化Repository
,那么Spring不会介入,并且不会注入依赖项。它不会神奇地发生,Spring必须以某种方式处于循环中 - 实例必须通过Spring处理层传递,并且直接实例化会阻止它。