В моем методе main () я создаю объект PersonCollection с использованием Spring, а затем начинаю загружать различные объекты Persons.
BeanFactory appContext = new ClassPathXmlApplicationContext("cp-beans.xml");
PersonCollection pc = appContext.getBean(PersonCollection.class);
Person aPerson = pc.loadById(1);
aPerson.doSomething();
aPerson.loadById(1067);
aPerson.doSomething();
В свою очередь PersonCollection.loadById () может загрузить объект из memcached или из Amazon SimpleDB:
public Person loadById(int id) throws ConnectException, NoSuchElementException {
String memCacheKey = "Person-" + id;
Person aPerson = (Person) cache.get(memCacheKey);
if (aPerson != null) {
return aPerson; //cache hit
}
aPerson = loadByIdFromSdb(id); //cache miss, read it from SimpleDB
cache.set(memCacheKey, aPerson);
return aPerson;
}
Таким образом, существует два способа создания Person: первый десериализуется из memcached, второй вызовет new Person () и назначит все данные.
Person имеет два свойства @Autowired и объявлен как @Service, а пакет находится в контексте: component-scan, однако зависимости не передаются, поскольку компонент создается с новым или из кэша, а не с Spring фреймворк.
Я мог бы использовать appContext.getBean () для создания объекта Person, однако это означало бы обойти applicationContext и использовать getBean () внутри приложения, что выглядит неправильно.
Как решить проблему?
ОБНОВЛЕНИЕ : Я прочитал документацию и попробовал предложение Райана Стюарта и написал небольшой пример проекта, чтобы попробовать его. Отлично работает, спасибо!
https://github.com/stivlo/spring-di
В конечном итоге я реорганизовал свой оригинальный проект таким образом, что эта функция мне больше не нужна, но это хороший инструмент для моего арсенала.