Пересмотр вашей архитектуры потенциально практичен в этом сценарии.Если вы можете изолировать данные, которые нужно сериализовать, в простой объект передачи данных (DTO), то должна быть возможность предоставить оболочку для этого DTO, которая сама может содержать зависимости от других bean-компонентов.
Например:
public interface IDataBean {
void setSomething(String someData);
}
// This is your session bean - just a plain DTO
public class MyDataBean implements IDataBean, Serializable {
private String someData;
public void setSomething( String someData ) {
this.someData = someData;
}
}
// This is the wrapper that delegates calls to a wrapped MyDataBean.
public class MyDataBeanWithDependency() implements IDataBean {
private SomeOtherService service;
private MyDataBean dataBean;
public SimpleDataBeanWithDependency(MyDataBean dataBean, SomeOtherService service) {
this.dataBean = dataBean;
this.service = service;
}
public void setSomething(String someData) {
// Here we make a call to the service to perform some specific logic that may, for example, hit a DB or something.
String transformedString = service.transformString(someData);
dataBean.setSomething(transformedString);
}
}
public class SomeService {
// This is a Spring session scoped bean (configured using <aop:scoped-proxy/>)
@Autowired
private MyDataBean myDataBean;
// Just a plain singleton Spring bean
@Autowired
private SomeOtherService someOtherService;
public IDataBean getDataBean() {
return new MyDataBeanWithDependency(myDataBean, someOtherService);
}
}
Извините за весь код!Однако позвольте мне попытаться объяснить, что я имею в виду здесь.Если вы всегда получаете сессионный компонент через службу (в данном случае SomeService), у вас есть возможность создать оболочку для сессионного компонента.Эта оболочка может содержать любые зависимости bean-компонента (автоматически подключенные к SomeService), которые вы можете использовать в качестве части выполнения логики вместе с сессионным компонентом.
Изящный аспект этого подхода заключается в том, что вы также можете программировать для интерфейса.(см. IDataBean).Это означает, что, если, например, у вас есть контроллер, который получает компонент данных от службы, это делает модульное тестирование / макетирование очень чистым.
Возможно, даже более чистый подход с точки зрения кода был быдля MyDataBeanWithDependency, чтобы быть зарегистрированным в контейнере пружины, используя область «запроса».Таким образом, вы можете просто подключить этот компонент напрямую к SomeService.Это, по сути, прозрачно решает проблему создания экземпляров, поэтому вам не нужно вручную создавать экземпляр MyDataBeanWithDependency из службы.
Надеюсь, я сделал достаточно, чтобы объяснить себя здесь!