Ένα bean scope ελέγχει πόσα instances δημιουργεί το container και πόσο ζουν. Τα lifecycle callbacks σου επιτρέπουν να τρέξεις κώδικα αμέσως μετά την κατασκευή ενός bean και ακριβώς πριν την καταστροφή του.
Ένα bean scope ελέγχει πόσα instances δημιουργεί το container και πόσο ζουν. Τα lifecycle callbacks σου επιτρέπουν να τρέξεις κώδικα αμέσως μετά την κατασκευή ενός bean και ακριβώς πριν την καταστροφή του.
@Service // singleton by default — one shared OrderService for the whole app
public class OrderService { }
@Component
@Scope("prototype") // fresh instance on every getBean/inject
public class ReportBuilder { }
Η κλασική παγίδα: το injection ενός prototype μέσα σε ένα singleton. Το singleton συνδέεται μία φορά, οπότε κρατά ένα μοναδικό prototype instance για πάντα — η υπόσχεση «νέο κάθε φορά» σπάει. Διόρθωσέ το με @Lookup, ένα ObjectProvider<ReportBuilder> ή scoped-proxy.
@Component
public class ConnectionPool {
@PostConstruct // runs after dependencies are injected, before use
public void open() { /* open sockets, warm caches */ }
@PreDestroy // runs on graceful container shutdown (singletons only)
public void close() { /* release resources */ }
}
Σημαντικό: το Spring δεν καλεί το @PreDestroy σε prototype beans — τα παραδίδει και σταματά να τα παρακολουθεί, οπότε εσύ έχεις την ευθύνη του καθαρισμού τους.
Αυτό ξεχωρίζει όσους αντιμετωπίζουν το Spring ως μαγεία από όσους κατανοούν το container. Το bug του singleton που κρατά ένα prototype είναι ένα αγαπημένο σενάριο συνέντευξης επειδή είναι λεπτό και προκαλεί πραγματικά production bugs. Το να ξέρεις ότι τα singletons πρέπει να είναι stateless και thread-safe (μοιράζονται σε όλα τα request threads) είναι το πρακτικό συμπέρασμα που ακούν οι συνεντευκτές.
Μια βιβλιοθήκη ερωτήσεων συνέντευξης IT με αναλυτικές απαντήσεις — από Junior έως Senior.
Δωρεά