Zwykłe zmienne zawierające referencje są zawsze strong:
Object referencja = new CośTam();
assert(referencja != null); // zawsze OK
Thread.sleep(dowolnyCzas);
assert(referencja != null); // zawsze OK
WeakReference nie są strong, bo mogą "zniknąć" ze środka:
WeakReference referencja = new WeakReference(new CośTam());
assert(referencja.get() != null); // prawie zawsze OK, trzeba mieć dużego pecha, żeby GC usunął referencję już przed tym wywołaniem
Thread.sleep(ileśTamCzasu);
assert(referencja.get() != null); // jeśli naśmiecimy i odpali się GC w międzyczasie to tutaj asercja nam rzuci błąd, bo słaba referencja została wyczyszczona przez GC
Jeżeli do obiektu prowadzą referencje o różnej sile to o jego usunięciu (i późniejszym wyczyszczeniu referencji) decyduje siła najsilniejszej referencji. Stąd jeśli masz WeakReference do jakiegoś obiektu, a w innym miejscu przez cały czas jest silna referencja to obiekt nie zostanie usunięty, a WeakReference nie zostanie wyczyszczona.
Osobną kwestią jest to czy Spring używa WeakReference gdzieś tam w swoich fabrykach.