Вот решение, которое я придумал, использующее Spring:
Я делаю обычный синглтон-компонент Spring с именем SessionBeanHolder.
Этот бин содержит список моих сессионных бинов.
Когда пользователь входит в систему, я добавляю сессионный компонент в мой SessionBeanHolder.
Когда вы ссылаетесь на сессионные компоненты в Spring, вы на самом деле имеете в виду прокси.
Поэтому ключевым моментом при выполнении этой работы было получение базового компонента для добавления в SessionBeanHolder.
Ниже приведен пример кода:
Примечание. Мой сессионный компонент называется SessionInfo.
@Scope(value="singleton")
@Component
public class SessionBeanHolder {
static Set<SessionInfo> beans;
public SessionBeanHolder() {
beans = new HashSet<SessionInfo>();
}
public Collection<SessionInfo> getBeans() {
return beans;
}
public void addBean(SessionInfo bean) {
try {
this.beans.add(removeProxyFromBean(bean));
} catch (Exception e) {
e.printStackTrace();
}
}
// Fetch the underlying bean that the proxy refers to
private SessionInfo removeProxyFromBean(SessionInfo proxiedBean) {
if (proxiedBean instanceof Advised) {
try {
return (SessionInfo) ((Advised) proxiedBean).getTargetSource().getTarget();
} catch (Exception e) {
throw new RuntimeException(e);
}
} else {
return proxiedBean;
}
}
}
Естественно, всякий раз, когда вы хотите добавить сессионный компонент или получить список всех компонентов, просто подключите SessionBeanHolder автоматически и используйте его методы.
@Autowired
SessionBeanHolder sessionBeanHolder;