Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Na tym forum takiego wątku jeszcze nie znalazłem. Ogólnie definicje obu reference znam, sporo poczytałem w Google, ale wg mnie słownikowe definicje nikogo niczego nie nauczą, a nikt nie podaje przykładów. Czy bean springowy wstrzyknięty przez DI jest strong reference, bo nigdy nie zostanie usunięty przez GC? A na przykład obiekt userDto przekazany jako parametr takiej meotdy:
Weak reference to typ : https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ref/WeakReference.html
Zarówno UserDto i bean Springowy to strong reference. I każda referencja może pójść ostatecznie pod GC, tyle że na przykład jakiś @Service nie trafi bo będzie raczej używany przez cały czas życia aplikacji, a UserDto żyje przez czas życia requestu na ogół.
Zwykłe zmienne zawierające referencje są zawsze strong:
Kopiuj
Object referencja =newCośTam();assert(referencja !=null);// zawsze OKThread.sleep(dowolnyCzas);assert(referencja !=null);// zawsze OK
WeakReference nie są strong, bo mogą "zniknąć" ze środka:
Kopiuj
WeakReference referencja =newWeakReference(newCośTam());assert(referencja.get()!=null);// prawie zawsze OK, trzeba mieć dużego pecha, żeby GC usunął referencję już przed tym wywołaniemThread.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.