Sobes.tech
Middle

Ποιο είναι ο κύκλος ζωής ενός αντικειμένου που δημιουργείται στο Spring;

sobes.tech AI

Απάντηση από AI

  1. Αρχικοποίηση: Το Spring δημιουργεί ένα στιγμιότυπο αντικειμένου.
  2. Γέμισμα Ιδιοτήτων: Οι εξαρτήσεις (πεδία που σημειώνονται με @Autowired, @Value κ.λπ.) εγχύονται μέσω setters ή πεδίων.
  3. Διεπαφές Aware: Εάν το bean υλοποιεί BeanNameAware, BeanFactoryAware, ApplicationContextAware ή άλλες διεπαφές Aware, το Spring καλεί τις αντίστοιχες μεθόδους (setBeanName, setBeanFactory, setApplicationContext κ.λπ.), περνώντας το πλαίσιο.
  4. BeanPostProcessors (πριν την αρχικοποίηση): Πριν από την κλήση των μεθόδων αρχικοποίησης, καλούνται οι postProcessBeforeInitialization των καταχωρημένων BeanPostProcessor.
  5. Αρχικοποίηση Bean:
    • Εάν το bean υλοποιεί το InitializingBean, καλείται η μέθοδός του afterPropertiesSet().
    • Εάν έχει οριστεί μια μέθοδος αρχικοποίησης μέσω @Bean(initMethod="...") ή init-method στο XML, καλείται αυτή η μέθοδος.
  6. BeanPostProcessors (μετά την αρχικοποίηση): Μετά την αρχικοποίηση, καλούνται οι postProcessAfterInitialization των καταχωρημένων BeanPostProcessor. Σε αυτό το στάδιο, συχνά δημιουργούνται proxy αντικείμενα (π.χ., για διαχείριση συναλλαγών ή ασφάλεια).
  7. Έτοιμο προς χρήση: Το αντικείμενο θεωρείται πλήρως διαμορφωμένο και έτοιμο προς χρήση.
  8. Καταστροφή:
    • Εάν το bean υλοποιεί το DisposableBean, καλείται η μέθοδός του destroy().
    • Εάν έχει οριστεί μια μέθοδος καταστροφής μέσω @Bean(destroyMethod="...") ή destroy-method στο XML, καλείται αυτή η μέθοδος.
    • Καλείται η μέθοδος που σημειώνεται με @PreDestroy.
  9. Καθαρισμός: Το 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 {
        // ...
    }
}