Итак, почему мой бин нулевой? - PullRequest
3 голосов
/ 29 ноября 2010

Я недавно задал этот вопрос относительно извлечения бобов из контекста приложения.Ответ был действительно полезным, но теперь, похоже, у меня проблема с доступом к этому бину из класса вне теста.Другими словами, мой тест создает экземпляр класса, который использует bean-компонент из контекста приложения, но этот bean-компонент продолжает показывать ноль.

Мой тест устанавливает контекст приложения следующим образом:

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

Мой тест программно создает экземпляр класса Repository:

    Repository searcher = new Repository();

В классе My Repository есть следующая переменная-член:

 @Resource
 private MyFactory myFactory;

Если я правильно понимаю Spring, это должно выглядеть в контексте текущего приложения.для боба с именем myFactory.Согласно тесту, текущий контекст приложения должен быть 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.В моем тесте, чтобы убедиться, что мой applicationContext-test.xml работает, я включил этот же bean-компонент в качестве переменной-члена так же, как и в классе Repository.Во время выполнения теста переменная myFactory в файле, содержащем тест, выглядит именно так, как я и ожидал.Однако, когда я добираюсь до класса Repository, переменная myFactory в этом классе является нулевой.Кажется, что этот класс не создает экземпляр переменной myFactory на основе определения компонента в applicationContext-test.xml.Может кто-нибудь сказать мне, почему?

Обновление

Я изменил переменную searcher, чтобы она была бином Spring, а не создавал экземпляр класса Repository вручную,и теперь переменная myFactory заполнена в классе Repository.Может кто-нибудь объяснить, почему это должен быть боб, чтобы работать?

1 Ответ

3 голосов
/ 30 ноября 2010

Если вы создадите экземпляр Repository самостоятельно, Spring не включится, и зависимости не будут внедрены.Это не происходит волшебным образом, Spring должен каким-то образом находиться в цикле - экземпляр должен быть пропущен через слои обработки Spring, и прямое создание экземпляров предотвращает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...