Middle
Ποιο είναι ο κύκλος ζωής ενός αντικειμένου που δημιουργείται στο Spring;
sobes.tech AI
Απάντηση από AI
- Αρχικοποίηση: Το Spring δημιουργεί ένα στιγμιότυπο αντικειμένου.
- Γέμισμα Ιδιοτήτων: Οι εξαρτήσεις (πεδία που σημειώνονται με
@Autowired,@Valueκ.λπ.) εγχύονται μέσω setters ή πεδίων. - Διεπαφές Aware: Εάν το bean υλοποιεί
BeanNameAware,BeanFactoryAware,ApplicationContextAwareή άλλες διεπαφές Aware, το Spring καλεί τις αντίστοιχες μεθόδους (setBeanName,setBeanFactory,setApplicationContextκ.λπ.), περνώντας το πλαίσιο. - BeanPostProcessors (πριν την αρχικοποίηση): Πριν από την κλήση των μεθόδων αρχικοποίησης, καλούνται οι
postProcessBeforeInitializationτων καταχωρημένωνBeanPostProcessor. - Αρχικοποίηση Bean:
- Εάν το bean υλοποιεί το
InitializingBean, καλείται η μέθοδός τουafterPropertiesSet(). - Εάν έχει οριστεί μια μέθοδος αρχικοποίησης μέσω
@Bean(initMethod="...")ήinit-methodστο XML, καλείται αυτή η μέθοδος.
- Εάν το bean υλοποιεί το
- BeanPostProcessors (μετά την αρχικοποίηση): Μετά την αρχικοποίηση, καλούνται οι
postProcessAfterInitializationτων καταχωρημένωνBeanPostProcessor. Σε αυτό το στάδιο, συχνά δημιουργούνται proxy αντικείμενα (π.χ., για διαχείριση συναλλαγών ή ασφάλεια). - Έτοιμο προς χρήση: Το αντικείμενο θεωρείται πλήρως διαμορφωμένο και έτοιμο προς χρήση.
- Καταστροφή:
- Εάν το bean υλοποιεί το
DisposableBean, καλείται η μέθοδός τουdestroy(). - Εάν έχει οριστεί μια μέθοδος καταστροφής μέσω
@Bean(destroyMethod="...")ήdestroy-methodστο XML, καλείται αυτή η μέθοδος. - Καλείται η μέθοδος που σημειώνεται με
@PreDestroy.
- Εάν το bean υλοποιεί το
- Καθαρισμός: Το Spring διαγράφει το bean από το πλαίσιο.
// Παράδειγμα bean που συμμετέχει στον κύκλο ζωής
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class MySpringBean implements InitializingBean, DisposableBean, BeanNameAware {
private String beanName;
// 2. Γέμισμα Ιδιοτήτων (μέσω setter)
private Dependency requiredDependency;
public void setRequiredDependency(Dependency requiredDependency) {
System.out.println("2. Ορισμός εξάρτησης");
this.requiredDependency = requiredDependency;
}
// Διεπαφές Aware
@Override
public void setBeanName(String name) {
System.out.println("3. Ορισμός ονόματος bean: " + name);
this.beanName = name;
}
// Αρχικοποίηση Bean (από InitializingBean)
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("5. Κλήση afterPropertiesSet() από InitializingBean");
// Λογική αρχικοποίησης
}
// @PostConstruct μέθοδος
@PostConstruct
public void postConstructMethod() {
System.out.println("5. Κλήση μεθόδου @PostConstruct");
// Λογική αρχικοποίησης
}
// Προσαρμοσμένη μέθοδος init
public void customInitMethod() {
System.out.println("5. Κλήση προσαρμοσμένης μεθόδου init");
// Λογική αρχικοποίησης
}
// Έτοιμο προς χρήση
public void doSomething() {
System.out.println("7. Το bean είναι έτοιμο και κάνει κάτι");
}
// Καταστροφή (από DisposableBean)
@Override
public void destroy() throws Exception {
System.out.println("8. Κλήση destroy() από DisposableBean");
// Λογική καθαρισμού
}
// @PreDestroy μέθοδος
@PreDestroy
public void preDestroyMethod() {
System.out.println("8. Κλήση μεθόδου @PreDestroy");
// Λογική καθαρισμού
}
// Προσαρμοσμένη μέθοδος destroy
public void customDestroyMethod() {
System.out.println("8. Κλήση προσαρμοσμένης μεθόδου destroy");
// Λογική καθαρισμού
}
// Εσωτερική κλάση για παράδειγμα εξάρτησης
public static class Dependency {
// ...
}
}