Dieser Leitfaden bietet eine umfassende Exemplar des Lebenszyklus des Frühlingsbohnens und demonstriert jede Stufe mit praktischen Beispielen. Wir werden die Lebenszyklus -Methoden von Spring nacheinander untersuchen und ein solides Verständnis dafür aufbauen, wie der Frühling seine Bohnen von der Registrierung bis zur Zerstörung verwaltet.
registerBeanDefinition()
) Wir beginnen mit der Untersuchung, wie Frühlingsbean -Definitionen vor Instanziation, Nutzung BeanDefinitionRegistry
.
Was passiert: Federlasten und registriert Bean -Definitionen aus verschiedenen Quellen: @ComponentScan
, @Bean
Methoden in @Configuration
Klassen und XML -Konfiguration (falls verwendet). Entscheidend ist, dass an diesem Punkt keine Bohnen instanziiert werden . Spring speichert einfach Metadaten über jede Bohne.
Praktisches Beispiel: manuell eine Bean mit einem BeanDefinitionRegistryPostProcessor
.
@Configuration public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(MyDynamicBean.class); registry.registerBeanDefinition("myDynamicBean", beanDefinition); System.out.println("Custom bean definition registered: MyDynamicBean"); } // ... (rest of the code remains the same) }
Key Takeaway: Dynamische Bean -Registrierung (z. B. basierend auf Bedingungen oder externen Konfigurationen) wird durch diese Methode erreicht. Bohnen sind in dieser Phase im Wesentlichen Blaupausen. Verwenden Sie diese Methode sparsam, nur wenn eine dynamische Registrierung wirklich erforderlich ist.
postProcessBeforeInstantiation()
) Als nächstes untersuchen wir InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation()
.
Was passiert: Diese Methode führt vor vor der Instanziierung einer Bean aus. Es ermöglicht eine Änderung oder den Austausch der Bean -Instanz vor Erstellung oder sogar die Verhinderung der Standard -Instanziierung durch Rückgabe eines Proxy- oder benutzerdefinierten Objekts.
Praktisches Beispiel: Bean -Instanziierung für Protokollierungszwecke abfangen.
@Component class CustomInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor { @Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { System.out.println("Before instantiating bean: " + beanName); return null; // Allows normal instantiation } }
Schlüsselbeobachtung: Diese Methode wird vor der Konstruktor ausgeführt. Es ist wertvoll für AOP -Szenarien (Erstellen von Proxys).
setBeanName()
) Nach der Instanziierung ruft Frühjahr BeanNameAware#setBeanName()
.
Was passiert: Die Bean wird im Anwendungskontext auf ihren eigenen Namen aufmerksam. Dies geschieht vor Abhängigkeitsinjektion.
Praktisches Beispiel: Eine Bean, die ihren eigenen Namen erkennt.
class MyDynamicBean implements BeanNameAware { private String beanName; // ... (constructor and other methods) @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } }
Schlüsselbeobachtung: Diese Methode wird unmittelbar nach der Instantiation aufgerufen. Die Bohne kann ihren Namen für die spätere Verwendung speichern (z. B. Protokollierung oder interne Manipulation).
Die verbleibenden Lebenszyklusmethoden (BeanClassLoaderAware
, BeanFactoryAware
, EnvironmentAware
, EmbeddedValueResolverAware
, ResourceLoaderAware
, ApplicationEventPublisherAware
, MessageSourceAware
und ApplicationContextAware
) Folgen Setzermethode, die der Bean Zugang zu einer entscheidenden Federkomponente verleiht. Diese werden im Originaldokument beschrieben und folgen der gleichen Struktur von "Was passiert", "praktisches Beispiel" und "Schlüsselbeobachtung". Sie ermöglichen den Zugriff auf den Klassenloader, den Bean Factory, die Umgebungseigenschaften, den eingebetteten Wert Resolver, den Ressourcenloader, den Ereignisverlag, die Nachrichtenquelle bzw. der Anwendungskontext.
postProcessBeforeInitialization()
) BeanPostProcessor#postProcessBeforeInitialization()
wird vor Initialisierungsrückrufe als bezeichnet (@PostConstruct
, InitializingBean#afterPropertiesSet()
).
Was passiert: Ermöglicht die Änderung von Beaneigenschaften oder die Anwendung von Aspekten (Proxying, Validierung, Protokollierung), bevor die Bean vollständig initialisiert ist.
Praktisches Beispiel: Vor der Initialisierung eine Bean ändern.
@Configuration public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(MyDynamicBean.class); registry.registerBeanDefinition("myDynamicBean", beanDefinition); System.out.println("Custom bean definition registered: MyDynamicBean"); } // ... (rest of the code remains the same) }
Schlüsselbeobachtung: Diese Methode wird vor den Initialisierungs -Rückrufbacks ausgeführt.
@PostConstruct
, afterPropertiesSet()
) Spring ruft nach postProcessBeforeInitialization()
.
Was passiert: @PostConstruct
(Annotationsbasierte) und InitializingBean#afterPropertiesSet()
(Schnittstellenbasierte) werden zur Validierung, zur Ressourceneinrichtung oder für die Initialisierung nach der Abhängigkeit verwendet.
Praktisches Beispiel: Verwenden Sie sowohl @PostConstruct
als auch afterPropertiesSet()
.
@Component class CustomInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor { @Override public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { System.out.println("Before instantiating bean: " + beanName); return null; // Allows normal instantiation } }
Schlüsselbeobachtung: @PostConstruct
läuft vor afterPropertiesSet()
. Favor @PostConstruct
über die Implementierung InitializingBean
, es sei denn, es ist ausschließlich erforderlich.
postProcessAfterInitialization()
) BeanPostProcessor#postProcessAfterInitialization()
führt nach Initialisierungsrückrufe aus.
Was passiert: Ermöglicht das Anwenden von Proxys oder die Durchführung endgültiger Modifikationen nach der vollständigen Bean -Initialisierung.
Praktisches Beispiel: Änderungen nach der Initialisierung anwenden.
class MyDynamicBean implements BeanNameAware { private String beanName; // ... (constructor and other methods) @Override public void setBeanName(String name) { this.beanName = name; System.out.println("Bean name set: " + name); } }
Schlüsselbeobachtung: Diese Methode wird nach Initialisierungsrückrufe aufgerufen.
@PreDestroy
, destroy()
) Schließlich werden Zerstörungsaufrufe vor dem Abschalten der Anwendung aufgerufen.
Was passiert: @PreDestroy
(Annotationsbasiert) und DisposableBean#destroy()
(Schnittstellenbasierte) Stellen Sie sicher
Praktisches Beispiel: Ressourcen aufräumen.
@Configuration public class CustomBeanRegistrar implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); beanDefinition.setBeanClass(MyDynamicBean.class); registry.registerBeanDefinition("myDynamicBean", beanDefinition); System.out.println("Custom bean definition registered: MyDynamicBean"); } // ... (rest of the code remains the same) }
Schlüsselbeobachtung: läuft vor @PreDestroy
. Bevorzugen destroy()
, es sei denn, die Funktionalität von @PreDestroy
benötigt. DisposableBean
Das obige ist der detaillierte Inhalt vonSpring-: Ganzfleck-Bohnen-LIFECYCLE-FROM-Registrierung zu Zerstörung mit Sample-Beispiele. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!