Я хочу повторно ввести ограниченные по объему одиночным элементом зависимости в опытные бобы Spring, после того, как они были десериализованы.
Скажите, что у меня есть боб Процесса, который зависит от боба Репозитория. Боб Репозитория является ограниченным по объему как одиночным элементом, но боб Процесса ограничен по объему прототипом. Периодически я сериализирую Процесс и затем позже десериализовываю его.
class Process {
private Repository repository;
// getters, setters, etc.
}
Я не хочу сериализировать и десериализовывать Репозиторий. И при этом я не хочу помещать "переходный процесс" на членскую переменную, которая содержит ссылку на него в Процессе, ни ссылке на некоторый прокси или что-либо кроме простой членской переменной, объявленной как Репозиторий.
То, что я думаю, что хочу, - чтобы Процессу заполнили его зависимость сериализуемым прокси, который указывает (с переходной ссылкой) в Репозиторий, и, после десериализации, может найти Репозиторий снова. Как я мог настроить Spring, чтобы сделать это?
Я полагаю, что мог использовать прокси для содержания ссылок зависимостей, во многом как. Мне бы хотелось использовать ту точную технику. Но прокси, который я видел, что Spring генерирует, не является сериализуемым, и в документах говорится, что, если я использую его с одноэлементным бобом, я получу исключение.
Я мог использовать пользовательский объем, возможно, на одноэлементных бобах, которые будут всегда предоставлять прокси при просьбе относительно пользовательски ограниченного по объему боба. Это - хорошая идея? Другие идеи?
Как насчет добавления с использованием аспектов для добавления шага внедрения при десериализации объекта?
Для этого вам понадобится AspectJ или аналогичный. Это будет работать очень похоже на функцию @Configurable в Spring.
например. добавьте несколько советов по методу «private void readObject (ObjectInputStream in) выдает исключение IOException, ClassNotFoundException»
Эта статья также может помочь: http://java.sun.com/developer/technicalArticles/Programming/serialization/
Я считаю, что идея сериализации 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);
}
}