Как использовать Spring для разрешения зависимостей объекта, созданного вручную? - PullRequest
5 голосов
/ 26 ноября 2009

Я хотел бы знать, возможно ли использовать Spring для разрешения зависимостей объекта, созданного вручную в моей программе. Взгляните на следующий класс:

public class TestClass {

   private MyDependency md;

   public TestClass() {
   }

   ...

   public void methodThaUsesMyDependency() {
      ...
      md.someMethod();
      ...
   }

}

Этот TestClass не является пружинным компонентом, но требует MyDependency, то есть пружинный компонент. Есть ли способ, которым я могу внедрить эту зависимость через Spring, даже если я создаю экземпляр TestClass с новым оператором внутри моего кода?

Спасибо

Ответы [ 3 ]

3 голосов
/ 26 ноября 2009

Редактировать: Метод, который я описываю в своем первоначальном ответе ниже, является общим способом выполнения DI вне контейнера. Для вашей конкретной потребности - тестирования - я согласен с ответом диджея. Гораздо более целесообразно использовать тестовую поддержку Spring, например:

@Test
@ContextConfiguration(locations = { "classpath*:**/applicationContext.xml" })
public class MyTest extends AbstractTestNGSpringContextTests {

    @Resource
    private MyDependency md;

    @Test
    public void myTest() {
            ...

Хотя приведенный выше пример является тестом TestNG, поддержка Junit также описана в 8.3.7.2. Управление контекстом и кеширование .


Общий подход: Аннотируйте свой класс с помощью @ Configurable и используйте AspectJ время загрузки или время компиляции. См. 6.8.1 в документации Spring для AOP для получения более подробной информации.

Затем вы можете аннотировать переменные вашего экземпляра с помощью @ Resource или @ Autowired . Хотя они выполняют одну и ту же цель внедрения зависимостей, я рекомендую использовать @ Resource , так как это стандарт Java, а не специфичный для Spring.

Наконец, не забудьте использовать ключевое слово transient (или @ Transient для JPA), если вы планируете сериализацию или сохранение объектов в будущем. Скорее всего, вы не хотите сериализовать ссылки на ваш DI-репозиторий, службу или компоненты.

2 голосов
/ 26 ноября 2009

См. Метод autowire () в классе AutowireCapableBeanFactory. Если вы используете ClasspathXmlApplicationContext, вы можете получить фабрику с помощью getAutowireCapableBeanFactory ()

Чтобы получить ApplicationContext, вам потребуется использовать статический одноэлементный или другой центральный репозиторий, такой как JNDI или контейнер сервлетов. См. DefaultLocatorFactory о том, как получить экземпляр ApplicationContext.

1 голос
/ 26 ноября 2009

Если вам нужно тестировать, Spring имеет хорошую поддержку для сценария, который вы описали выше.

Выезд Пружина Справочное руководство по тестированию

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