首页 > Java > java教程 > 春季:整个spring-bean-lifecycle-from-from-from-from-for-totuction to-samplem-tamples

春季:整个spring-bean-lifecycle-from-from-from-from-for-totuction to-samplem-tamples

DDD
发布: 2025-01-29 20:14:10
原创
940 人浏览过

spring-: entire-spring-bean-lifecycle-from-registration-to-destruction-with-sample-examples

>本指南提供了弹簧豆生命周期的全面演练,以实践的例子展示了每个阶段。 我们将顺序探索春季的生命周期方法,对春季如何管理其从注册到破坏的豆类有深入的了解。

>

步骤1:BEAN定义注册(registerBeanDefinition()

>

我们首先检查弹簧寄存器bean定义如何在>实例化之前,利用>。BeanDefinitionRegistry

发生了什么:弹簧加载和从各种来源登记bean定义:>,@ComponentScan类中的方法和xml configuration(如果使用)。 至关重要的是,此时没有实例化的豆类。 春季只是将元数据存储在每个豆子周围。@Bean @Configuration实践:>使用

密钥外卖:BeanDefinitionRegistryPostProcessor动态bean注册(例如,基于条件或外部配置)是通过此方法实现的。 在此阶段,豆子本质上是蓝图。 只有在真正必要的动态注册时,只有很少使用此方法。

>
<code class="language-java">@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)
}</code>
登录后复制
登录后复制
登录后复制
>步骤2:实例化之前(

接下来,我们探索

postProcessBeforeInstantiation()发生了什么:此方法在

bean的实例化之前执行

。 它允许在创建之前修改或替换Bean实例InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation(),甚至可以通过返回代理或自定义对象来预防标准实例。

>

实例:截取bean实例来记录目的。 密钥观察:

此方法在调用构造函数之前运行

。 它对于AOP方案(创建代理)很有价值。> 步骤3:bean名称意识(

<code class="language-java">@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
    }
}</code>
登录后复制
登录后复制
实例化后,春季呼叫

>发生了什么: bean在应用程序上下文中意识到了自己的名称。这发生在

依赖注入之前。

> setBeanName()

实践示例: bean识别自己的名字。>

BeanNameAware#setBeanName()

键观察:

此方法立即在发生后立即称为。 豆可以存储其名称以供以后使用(例如,日志记录或内部操作)。

>步骤4-12:进一步的生命周期方法

剩余的生命周期方法(BeanClassLoaderAwareBeanFactoryAwareEnvironmentAwareEmbeddedValueResolverAwareResourceLoaderAwareApplicationEventPublisherAwareMessageSourceAwareApplicationContextAware

>)遵循类似的模式:春季调用特定的模式Setter方法,为BEAN提供了对关键的弹簧组件的访问。 这些内容在原始文档中详细介绍,并遵循“发生什么”,“实际示例”和“关键观察”的相同结构。 他们允许分别访问ClassLoader,Bean Factory,Environment Properties,嵌入式值解析器,资源加载程序,事件发布者,消息源和应用程序上下文。postProcessBeforeInitialization()>

>步骤13:在初始化之前(

BeanPostProcessor#postProcessBeforeInitialization() >在@PostConstructInitializingBean#afterPropertiesSet()

初始化回调之前()。

>

发生了什么:>允许在Bean完全初始化之前修改Bean属性或方面的应用(代理,验证,记录)。

实践:
<code class="language-java">@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)
}</code>
登录后复制
登录后复制
登录后复制
在初始化之前修改bean。

>

密钥观察:

此方法在初始化回调之前执行。@PostConstruct afterPropertiesSet()>步骤14:初始化回调(

postProcessBeforeInitialization()

春季在

> 之后调用初始化回调 @PostConstruct>发生了什么:InitializingBean#afterPropertiesSet()

(基于注释)和

(基于接口)用于验证,资源设置或任何依赖后依赖性注入初始化。 实践:@PostConstruct使用afterPropertiesSet()

>。
<code class="language-java">@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
    }
}</code>
登录后复制
登录后复制

键观察:@PostConstructafterPropertiesSet()>在@PostConstruct之前运行。 除非严格必要,否则优惠InitializingBean

>步骤15:初始化(postProcessAfterInitialization()

之后

BeanPostProcessor#postProcessAfterInitialization()执行初始化回调。

>

>发生了什么:>允许在完整的bean初始化后应用代理或执行最终修改。

实践示例:应用后启动后修改。

<code class="language-java">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);
    }
}</code>
登录后复制

> 密钥观察:此方法在初始化回调后调用。

>步骤16:破坏回调(@PreDestroydestroy()

>最后,在应用程序关闭之前调用破坏回调。

>

>>发生了什么:@PreDestroy(基于注释)和DisposableBean#destroy()(基于接口)确保正确的资源清理。

实践:清理资源。

<code class="language-java">@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)
}</code>
登录后复制
登录后复制
登录后复制

键观察:>在@PreDestroy之前运行。 除非需要destroy()>的功能。 @PreDestroy这个全面的概述详细介绍了弹簧豆生命周期,使开发人员能够有效利用Spring的生命周期管理功能来实现稳健且管理良好的应用。

以上是春季:整个spring-bean-lifecycle-from-from-from-from-for-totuction to-samplem-tamples的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板