代码之家  ›  专栏  ›  技术社区  ›  Samo

为什么我的豆子是空的?

  •  3
  • Samo  · 技术社区  · 14 年前

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

    我的测试设置应用程序上下文如下:

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

    我的测试以编程方式实例化存储库类:

        Repository searcher = new Repository();
    

    我的知识库类具有以下成员变量:

     @Resource
     private MyFactory myFactory;
    

    如果我正确理解Spring,那么应该查找名为 myFactory . 根据测试,当前应用程序上下文应该是 applicationContext-test.xml ,其中包含 肌厂 :

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

    将来,此工厂方法将返回模拟。但目前,它只返回 Factory 对象:

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

    当我从浏览器运行应用程序时, 肌厂 变量是根据中的bean定义正确实例化的。 applicationContext.xml . 在我的测试中,确保 应用程序上下文-test.xml 正在工作,我将这个bean作为一个成员变量列出,就像在 Repository 班级。在运行测试时, 肌厂 包含测试的文件中的变量与我预期的完全相同。但是,当我到达 知识库 肌厂 该类中的变量为空。似乎这个类没有实例化 肌厂 基于中bean定义的变量 应用程序上下文-test.xml . 有人能告诉我为什么吗?

    更新

    我改变了 searcher 变量,以便它是一个SpringBean,而不是实例化 知识库 手动类,现在 肌厂 变量已填充到 知识库 班级。有人能解释为什么这需要是一个bean才能工作吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   skaffman    14 年前

    如果你实例化 Repository 你自己,那么Spring就不会参与进来,依赖关系也不会被注入。它不会神奇地发生,Spring必须以某种方式在循环中——实例必须通过Spring处理层传递,直接实例化可以防止这种情况发生。