Voici une solution je suis venu avec qui utilise Spring:
Je fais un haricot normale printemps singleton appelé SessionBeanHolder. Ce bean contient une liste de mes beans de session. Lorsqu'un utilisateur se connecte, j'ajoute le bean session à mon SessionBeanHolder.
Lorsque vous faites référence à des beans de session dans Spring, vous faites réellement référence à des proxies. Donc la clé de ce travail était de récupérer le bean sous-jacent à ajouter au SessionBeanHolder.
est Ci-dessous l'exemple de code:
Note: Ma bean session est appelée 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;
}
}
}
Naturellement, chaque fois que vous voulez ajouter bean session ou chercher une liste de tous les haricots, juste le SessionBeanHolder et lier automatiquement utiliser ses méthodes.
@Autowired
SessionBeanHolder sessionBeanHolder;