Как встраивать зависимости в самоинститутированный объект в 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
в него?