Похоже, что щедрость не привлекла ни одного ответа, поэтому я задокументирую свое ограниченное понимание:
@Configuration
public class SpringConfig {
@Bean
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
MyService myService() {
return new MyService();
}
@Bean
@Scope("request")
public IndexBean indexBean() {
return new IndexBean();
}
@Bean
@Scope("request")
public DetailBean detailBean() {
return new DetailBean();
}
}
public class IndexBean implements Serializable {
@Inject MyService myService;
public void doSomething() {
myService.sayHello();
}
}
public class MyService {
public void sayHello() {
System.out.println("Hello World!");
}
}
Тогда Spring не вставит голый MyService в IndexBean, а будет сериализуемым прокси-сервером. (Я проверил это, и это сработало).
Однако весенняя документация пишет :
Вы не должны использовать <aop:scoped-proxy/>
в сочетании с бобами, которые определены как singletons
или prototypes
. Если вы попытаетесь создать прокси в области действия для одноэлементного компонента, BeanCreationException
поднимется.
По крайней мере, при использовании конфигурации на основе Java, bean-компонент и его прокси могут быть созданы просто, то есть, исключение не выдается. Тем не менее, похоже, что использование прокси с заданной областью для достижения сериализуемости не является предназначением таких прокси. Поэтому я опасаюсь, что Spring мог бы исправить эту «ошибку» и предотвратить создание прокси-серверов с областью видимости через конфигурацию на основе Java.
Также существует ограничение: имя класса прокси-сервера меняется после перезапуска веб-приложения (поскольку имя класса прокси-сервера основано на хэш-коде совета, использованного для его создания, что, в свою очередь, зависит от hashCode объекта класса перехватчика. Class.hashCode не переопределяет Object.hashCode, который нестабилен при перезапусках). Поэтому сериализованные сеансы не могут использоваться другими виртуальными машинами или при перезапуске.