Java 那么为什么我的bean是空的呢?
我最近询问了从applicationContext中提取bean的问题。答案确实很有帮助,但现在看来我在从测试之外的类访问这个bean时遇到了问题。换句话说,我的测试实例化了一个类,该类使用来自应用程序上下文的bean,但这个bean总是出现空值 我的测试设置应用程序上下文如下:Java 那么为什么我的bean是空的呢?,java,spring,dependency-injection,Java,Spring,Dependency Injection,我最近询问了从applicationContext中提取bean的问题。答案确实很有帮助,但现在看来我在从测试之外的类访问这个bean时遇到了问题。换句话说,我的测试实例化了一个类,该类使用来自应用程序上下文的bean,但这个bean总是出现空值 我的测试设置应用程序上下文如下: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/applicationContext-test.xml") pub
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/applicationContext-test.xml")
public class SearcherTests {
我的测试以编程方式实例化存储库类:
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" />
当我从浏览器运行应用程序时,myFactory
变量已从applicationContext.xml
中的bean定义中正确实例化。在我的测试中,为了确保我的applicationContext test.xml
工作正常,我将这个bean作为成员变量列出,就像我在存储库
类中所做的一样。运行测试时,包含测试的文件中的myFactory
变量看起来与我期望的完全一样。但是,当我到达存储库
类时,该类中的myFactory
变量为null。这个类似乎没有根据applicationContext test.xml
中的bean定义实例化myFactory
变量。有人能告诉我为什么吗
更新
我更改了
searcher
变量,使其成为Springbean,而不是手动实例化Repository
类,现在myFactory
变量已填充到Repository
类中。有人能解释一下为什么这需要一个bean才能工作吗?如果您自己实例化存储库,那么Spring就不会参与,依赖关系也不会被注入。它不是神奇地发生的,Spring必须以某种方式在循环中-实例必须通过Spring处理层传递,而直接实例化可以防止这种情况发生。它如何获得存储库
?它是SpringBean吗?不,存储库不是SpringBean。我的测试实际上实例化了一个类,而这个类又实例化了存储库类。所有这些实例化都是以编程方式完成的。我将存储库更改为Springbean,现在可以使用了。不知道为什么它需要一个bean才能工作。如果这个类直接在应用程序代码中实例化,那么依赖关系就可以很好地被注入。我所知道的这两种场景之间的唯一区别是,当应用程序运行时,applicationContext由web.xml加载。然而,我对Spring还不熟悉,所以可能还有其他一些我不知道的差异。如果你能澄清这一点,我将不胜感激,因为我想更好地理解Spring。
public class Mocks {
public static MyFactory createMockFactory() {
return new MyFactory();
}
}