Как встраивать зависимости в самоинститутированный объект в Spring?

Скажем, у нас есть класс:

public class MyClass {
    @Autowired private AnotherBean anotherBean;
}

Затем мы создали объект этого класса (или какая-то другая структура создала экземпляр этого класса).

MyClass obj = new MyClass();

Можно ли все еще вставлять зависимости? Что-то вроде:

applicationContext.injectDependencies(obj);

(Я думаю, что у Google Guice есть что-то вроде этого)

Ответ 1

Вы можете сделать это, используя метод autowireBean() AutowireCapableBeanFactory. Вы передаете ему произвольный объект, а Spring будет обрабатывать его, как то, что он сам создал, и будет применять различные куски автоустановки.

Чтобы получить элемент AutowireCapableBeanFactory, просто выполните автоустановку, которая:

private @Autowired AutowireCapableBeanFactory beanFactory;

public void doStuff() {
   MyBean obj = new MyBean();
   beanFactory.autowireBean(obj);
   // obj will now have its dependencies autowired.
}

Ответ 2

Вы также можете отметить свой MyClass с помощью @Configurable аннотации:

@Configurable
public class MyClass {
   @Autowired private AnotherClass instance
}

Затем во время создания он автоматически вводит свои зависимости. Вы также должны иметь <context:spring-configured/> в своем контексте xml приложения.

Ответ 3

Не обойтись без обходных решений, так как Spring ничего не знает об этом экземпляре.

Реальный вопрос: почему вы создаете экземпляры класса, которые вы хотите использовать вложенные вручную, а не позволяете Spring управлять им? Почему класс, использующий MyClass, не получает MyClass в него?