как повторно прикрепить одноэлементные бобы Spring после десериализации

Я хочу повторно ввести ограниченные по объему одиночным элементом зависимости в опытные бобы Spring, после того, как они были десериализованы.

Скажите, что у меня есть боб Процесса, который зависит от боба Репозитория. Боб Репозитория является ограниченным по объему как одиночным элементом, но боб Процесса ограничен по объему прототипом. Периодически я сериализирую Процесс и затем позже десериализовываю его.

class Process {
   private Repository repository;
   // getters, setters, etc.
}

Я не хочу сериализировать и десериализовывать Репозиторий. И при этом я не хочу помещать "переходный процесс" на членскую переменную, которая содержит ссылку на него в Процессе, ни ссылке на некоторый прокси или что-либо кроме простой членской переменной, объявленной как Репозиторий.

То, что я думаю, что хочу, - чтобы Процессу заполнили его зависимость сериализуемым прокси, который указывает (с переходной ссылкой) в Репозиторий, и, после десериализации, может найти Репозиторий снова. Как я мог настроить Spring, чтобы сделать это?

Я полагаю, что мог использовать прокси для содержания ссылок зависимостей, во многом как. Мне бы хотелось использовать ту точную технику. Но прокси, который я видел, что Spring генерирует, не является сериализуемым, и в документах говорится, что, если я использую его с одноэлементным бобом, я получу исключение.

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

8
задан Ladlestein 12 August 2010 в 20:38
поделиться

2 ответа

Как насчет добавления с использованием аспектов для добавления шага внедрения при десериализации объекта?

Для этого вам понадобится AspectJ или аналогичный. Это будет работать очень похоже на функцию @Configurable в Spring.

например. добавьте несколько советов по методу «private void readObject (ObjectInputStream in) выдает исключение IOException, ClassNotFoundException»

Эта статья также может помочь: http://java.sun.com/developer/technicalArticles/Programming/serialization/

1
ответ дан 5 December 2019 в 18:55
поделиться

Я считаю, что идея сериализации bean-компонента с последующим принудительным повторным внедрением зависимостей - не лучшая архитектура.

Как насчет того, чтобы вместо этого иметь какой-нибудь компонент ProcessWrapper, который мог бы быть синглтоном. Он будет внедрен вместе с репозиторием и либо управляет десериализацией процесса, либо имеет для него установщик. Когда в оболочке устанавливается новый процесс, он вызывает setRepository () для процесса. Компоненты, использующие процесс, могут быть либо установлены оболочкой с новым, либо вызывать ProcessWrapper, который будет делегировать процессу.

class ProcessWrapper {
   private Repository repository;
   private Process process;
   // getters, setters, etc.

   public void do() {
      process.do();
   }

   public void setProcess(Process process) {
      this.process = process;
      this.process.setRepository(repository);
   }
}
1
ответ дан 5 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: