浅析Spring生命周期

这篇具有很好参考价值的文章主要介绍了浅析Spring生命周期。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

浅析Spring生命周期

前言

Spring框架是一个非常流行的Java企业级应用程序框架,已经成为许多生产环境中的首选技术。它提供了一种便捷的方法来帮助开发人员构建可扩展和模块化的企业级应用程序。在Spring框架中,Bean生命周期是非常重要的一部分,它负责Bean的创建和销毁。

一个完整的Spring的Bean的生命周期

Spring框架中Bean的完整生命周期包括:

  1. 实例化Bean
  2. 设置对象属性
  3. 对Bean执行用户定义的初始化方法
  4. Bean可用
  5. 关闭容器

实例化Bean

在 Spring 中,实例化 Bean 主要有两种方式:使用构造函数实例化和使用静态工厂方法实例化。

构造函数实例化是使用类的构造函数创建 Bean 对象的方式。在 Spring 配置文件中,可以通过 元素的 constructor-arg 子元素来指定 Bean 的构造函数参数。

静态工厂方法实例化是指在 BeanFactory 创建 Bean 实例时,调用静态工厂方法创建 Bean 对象。在 Spring 配置文件中,可以通过 元素的 class 属性和 factory-method 属性来指定 Bean 工厂类和工厂方法。

需要注意的是,在 Spring 中,Bean 实例化后并不直接进入使用状态,而是存放在 BeanFactory 中,等待被其他 Bean 使用。如果没有配置 Bean 的作用域为 singleton,则每次使用 Bean 时都会创建一个新的 Bean 实例。

在Bean实例化的时候,有几个比较重要的接口,我们可以看下。

1. BeanFactoryPostProcessor

BeanFactoryPostProcessor它能够让开发人员在Bean工厂创建Bean之前对其进行配置或修改,同时还能在Bean实例化之前进行一些定制化操作。通过BeanFactoryPostProcessor接口,开发人员可以访问到Spring容器内的BeanFactory,从而改变Bean的配置信息,例如将某个Bean的scope从singleton改变为prototype。

BeanFactoryPostProcessor接口包括一个方法postProcessBeanFactory( ConfigurableListableBeanFactory beanFactory ),它接收一个ConfigurableListableBeanFactory对象作为参数,这个对象可以被用来修改BeanFactory的配置。实现自定义BeanFactoryPostProcessor非常简单:只需要创建一个实现该接口的类,并在Spring配置文件中声明Bean即可。

2. BeanPostProcessor

当我们在创建Bean的时候,Spring框架会按照Bean的生命周期方法先后顺序执行相应的方法。其中BeanPostProcessor接口定义了两个方法,beforeInitialization和afterInitialization,用于在Bean初始化前和Bean初始化后进行处理。

BeanPostProcessor的主要作用是对Bean的实例进行后置处理。在Bean实例创建完成之后,BeanPostProcessor实例会对Bean进行一些额外的处理,或者说是修饰。例如,开发人员可以借助于BeanPostProcessor来实现一些非侵入式的集中式日志记录或者为Bean装配前初始化某些属性值,以及为Bean设置代理等。

设置对象属性

设置对象属性是Spring Bean生命周期中的一个阶段。在这个阶段,Spring框架会根据Bean的配置信息为对象设置属性并将其装配到应用程序中。

具体实现方法是在Bean的配置信息中添加属性元素,用于配置对象的属性值。例如:

<bean id="exampleBean" class="com.example.Example">
    <property name="name" value="John Doe" />
    <property name="age" value="30" />
</bean>

在上面的例子中,我们定义了一个名为exampleBean的Bean,它的类是com.example.Example。我们使用元素设置了对象的两个属性:name和age。可以看到,我们通过name属性指定了要设置的属性名,通过value属性指定要设置的属性值。Spring框架将使用反射机制调用对象的setter方法,并将属性值设置为参数。

另外,在使用注解的方式配置Bean时,也可以使用@Autowired注解或者@Resource注解为对象的属性进行自动装配。这些注解可以根据Type或Name自动查找适配的Bean进行装配,从而减少了手动配置Bean属性的工作。例如:

@Component
public class ExampleComponent {
    @Autowired
    private ExampleBean exampleBean;

    public void doSomething() {
        // 使用exampleBean对象执行一些操作
    }
}

@Component
public class ExampleBean {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

在上面的例子中,我们定义了一个使用@Autowired注解进行注入的ExampleComponent 组件,并将其属性exampleBean注入了一个ExampleBean对象。当Spring框架启动时,它会自动为ExampleComponent组件实例化对象,并调用setter方法将exampleBean对象注入到ExampleComponent中。

对Bean执行用户定义的初始化方法

对Bean执行用户定义的初始化方法在Spring框架中是通过Bean的生命周期回调方法来实现的。具体步骤如下:

1. 实现InitializingBean

InitializingBean是Spring框架中一个非常重要的接口之一,定义了Bean初始化后要执行的操作。在BeanFactory完成对Bean实例的配置和添加Bean实例的前置和后置处理工作之后,Spring容器将调用InitializingBean接口的afterPropertiesSet方法进行Bean的初始化执行操作。

在Spring容器中,实现InitializingBean接口的类变得非常重要,它允许开发人员控制Bean的完整生命周期。开发人员可以借助于afterPropertiesSet方法,为Bean初始化一些数据或者修饰/验证已经设置的某些依赖。

在Bean类中实现InitializingBean接口,该接口中定义了一个afterPropertiesSet()方法,该方法会在Bean初始化完成之后被调用。

public class MyBean implements InitializingBean {
    // ...
    @Override
    public void afterPropertiesSet() throws Exception {
        // 在这里编写Bean初始化的逻辑
        // ...
    }
    // ...
}

2. 使用@PostConstruct注解

还可以使用@PostConstruct注解,在Bean初始化完成之后执行指定的方法,例如:

public class MyBean {
    // ...
    @PostConstruct
    public void init() {
        // 在这里编写Bean初始化的逻辑
        // ...
    }
    // ...
}

3. 指定init方法

也可以在XML配置文件中指定Bean初始化时调用的方法,例如:

<bean id="myBean" class="com.example.MyBean" init-method="init"/>

其中,init-method属性指定了Bean初始化时要调用的方法名。

以上是三种常用的对Bean执行用户定义的初始化方法的实现方式,您可以根据具体情况选择其中的一种方式。

Bean可用

简单来说,在Spring生命周期中,Bean可用是在BeanFactory启动阶段的某个时刻被触发的,表示这个Bean已经完成了所有的初始化工作,可以被其他Bean调用和使用。在这个状态下,Bean已经处于正常运行状态,可以对外提供服务或者处理业务逻辑。

这里提供一个简单的Spring生命周期Bean可用的示例代码。首先,我们定义一个名为BeanLifeCycleDemo的类,并指定初始化和销毁方法。代码如下:

public class BeanLifeCycleDemo {
    private String message;

    public void init() {
        System.out.println("Bean is being initialized.");
        this.message = "Hello, world!";
    }

    public void destroy() {
        System.out.println("Bean is being destroyed.");
    }

    public String getMessage() {
        return this.message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

接下来,我们需要在Spring配置文件中声明这个类的Bean,并指定它的初始化和销毁方法。配置文件为beans.xml,代码如下:

<bean id="beanLifeCycleDemo" class="com.example.BeanLifeCycleDemo"
      init-method="init" destroy-method="destroy">
    <property name="message" value="Hello, world!"/>
</bean>

在这个示例中,我们使用了Spring的依赖注入功能,将属性message设置为Hello, world!。同时,我们指定了Bean的初始化方法为init(),和销毁方法为destroy()

最后,我们创建一个测试类AppTest,并在其中测试输出Bean的信息。代码如下:

public class AppTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("beans.xml");
        BeanLifeCycleDemo bean = context.getBean("beanLifeCycleDemo", BeanLifeCycleDemo.class);
        System.out.println(bean.getMessage());
        context.close();
    }
}

在这个测试类中,我们使用ClassPathXmlApplicationContext类创建了Spring容器,并通过context.getBean()方法获取了Bean实例。然后,我们输出了Bean的信息,即Hello, world!,并调用了context.close()方法,销毁了Bean。在控制台输出中,我们可以看到初始化方法“Bean is being initialized.”和销毁方法“Bean is being destroyed.”的信息。

通过以上示例,我们可以看到,在Spring生命周期中,Bean可用是在Bean初始化完成后被触发的。在这个状态下,我们可以对Bean进行操作,包括调用它的方法、获取它的属性等。
浅析Spring生命周期

关闭容器

在 Spring 框架中,Bean 生命周期的最后一个阶段是关闭容器,即当应用程序完成运行时,应调用 ApplicationContext 的 close() 方法,以便释放所有资源和 Bean 所占用的内存。当 ApplicationContext 关闭时,它会通知 Bean,以便它们可以对关闭操作作出响应。

以下是关闭容器时 Bean 生命周期涉及的步骤:

  1. 当 BeanFactory 关闭时,将调用所有 DisposableBean 实例的 destroy() 方法。

DisposableBean是Spring框架中一个很关键的接口。它定义了Bean在销毁时要执行的操作。在一个Bean被容器实例化之后,在容器销毁Bean之前,会调用Bean实现的这个接口。最常见的操作包括关闭数据库连接或停止根据消息队列执行的任务。如果有需要在Bean销毁之前释放某些资源,那么实现DisposableBean是很重要的。

  1. 如果 Bean 实现了 DisposableBean 接口,则调用 destroy() 方法。这个方法允许 Bean 清理任何在应用程序运行时已经初始化或记录的资源。

  2. 调用在 Bean 定义中定义的任何自定义销毁方法。自定义销毁方法可以通过指定 destroy-method 属性来定义。例如:

    <bean id="myBean" class="com.example.MyBean" destroy-method="cleanup"/>
    

    这里的 cleanup() 方法将在关闭容器时被调用。

  3. 关闭内部 bean 容器。
    如果 bean 是 ApplicationContext 的子容器,则首先关闭子容器中的 bean。然后关闭 ApplicationContext 自身,以确保所有 bean 处于已销毁状态。

需要注意的是,在应用程序关闭时,所有的资源,如数据库连接、文件句柄等,必须被有效地释放。因此,实现 destroy() 和自定义销毁方法是非常重要的。通过这些方法,可以确保 bean 释放所有的资源,并在关闭应用程序时正确地退出。

除了使用销毁方法之外,还可以使用注解来标注Bean的初始化和销毁方法。@PostConstruct和@PreDestroy是两个Spring框架中内置的注解,这些注解可以使用在任何方法上,只要符合Bean的规范即可。

@PostConstruct注解在Bean的初始化之后调用,@PreDestroy注解则在Bean被销毁之前调用。在使用注解的时候,只需要定义需要执行的方法,就可以同时实现Bean初始化和销毁的效果。
浅析Spring生命周期

结论

Spring的Bean生命周期可以分为两个阶段:BeanFactory准备和BeanFactory启动,其中Bean创建、初始化、销毁等过程都在这个时间段内完成。在BeanFactory准备阶段,Spring容器对BeanFactory进行了初始化,包括加载配置文件、实例化Bean工厂等。在该阶段,调用了Bean Factory Post Processor(BFPP)和Bean Post Processor(BPP)等接口,对FactoryBean和普通Bean进行预处理。在BeanFactory启动阶段,Spring容器启动后会实例化所有的Bean,并根据定义的属性、依赖等设置对Bean进行初始化。在这个过程中,调用了Bean的构造函数和初始化方法,对Bean进行了依赖注入等操作,同时也触发了Bean可以使用的状态。在容器关闭时,Spring会调用Bean的销毁方法以进行一些清理工作。文章来源地址https://www.toymoban.com/news/detail-476918.html

到了这里,关于浅析Spring生命周期的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring】——Spring生命周期

    ❤️❤️❤️Spring专栏更新中,各位大佬觉得写得不错,支持一下,感谢了!❤️❤️❤️ Spring_冷兮雪的博客-CSDN博客 前面我们讲完了Spring中有关Bean的读和取,我们还没有好好去了解了解Bean对象,这篇 就是对Bean的深入学习。 限定程序中变量的可用范围叫做作用域,或者说

    2024年02月08日
    浏览(53)
  • 【spring】spring bean的生命周期

    spring bean的生命周期 简介 本文测试并且介绍了spring中bean的生命周期,如果只想知道结果可以跳到最后一部分直接查看。 一、bean的创建阶段 spring中的bean是何时创建的? 在spring中有一个非常重要的注解,叫做**@Scope**,这个注解是用来控制spring中的bean是否是单例的,一般情况

    2024年02月15日
    浏览(52)
  • Spring进阶(十六)之spring生命周期

    目录 Bean生命周期 阶段1:Bean元信息配置阶段 Bean信息定义4种方式 API的方式 XML的方式 properties文件的方式 注解的方式 小结 阶段2:Bean元信息解析阶段 Bean元信息的解析主要有3种方式 XML方式解析:XmlBeanDefinitionReader properties文件定义bean的解析: PropertiesBeanDefinitionReader 注解方式

    2024年02月03日
    浏览(42)
  • Spring bean 生命周期

    在互联网领域中,Spring框架扮演着重要的角色。作为一个开源的Java应用程序开发框架,Spring提供了一种灵活而强大的方式来构建可扩展的应用程序。Spring框架中的一个重要概念是Bean,它是Spring应用程序的基本构建块之一。了解Spring Bean的生命周期对于充分利用Spring框架的功能

    2024年02月11日
    浏览(47)
  • 【Spring】—— bean生命周期

    1、初始化容器 1)创建对象(分配内存) 2)执行构造方法 3)执行属性注入(set操作) 4)执行bean初始化方法 2、使用bean 1)执行业务操作 3、关闭/销毁容器 1)执行bean销毁方法

    2024年02月02日
    浏览(50)
  • Spring:Bean生命周期

    Bean 生命周期 是 bean 对象从创建到销毁的整个过程。 简单的 Bean 生命周期的过程: 1.实例化(调用构造方法对 bean 进行实例化) 2.依赖注入(调用 set 方法对 bean 进行赋值) 3.初始化(手动配置 xml 文件中 bean 标签的 init-method 属性值,来指定调用对应的初始化方法) 4.使用

    2024年02月13日
    浏览(42)
  • 【Spring】Bean的作用域与生命周期详情:请简述Spring的执行流程并分析Bean的生命周期?

     我们都知道,Spring框架为开发人员提供了很多便捷,这使得开发人员能够更加专注于应用程序的核心业务逻辑,而不需要花费大量时间和精力在技术细节上。作为一个包含众多工具方法的IoC容器,存取JavaBean是其极为重要的一个环节。本文就对Spring中的Bean的作用域和生命周

    2024年02月12日
    浏览(48)
  • Spring Bean的生命周期

    Bean生命周期的整个执行过程描述如下: 1、根据配置情况调用Bean构造方法或工厂方法实例化 Bean。 2、利用依赖注入完成Bean中所有属性值的配置注入。 3、如果Bean 实现了BeanNameAware 接口,则 Spring调用Bean的setBeanName()方法传入当前Bean的id值。 4、如果Bean实现了BeanFactoryAware 接口

    2023年04月22日
    浏览(65)
  • Spring -- Bean的生命周期

    Spring容器在进行实例化时,会将xml配置的bean的信息封装成一个BeanDefinition对象,Spring根据BeanDefinition来创建Bean对象,里面有很多的属性用来描述Bean   BeanDefinition 中几个重要方法如下 beanClassName:bean 的类名 initMethodName:初始化方法名称 properryValues:bean 的属性值 scope:作用域

    2024年02月15日
    浏览(54)
  • 【Spring】Spring的Bean的生命周期

    作者简介:大家好,我是五度鱼,一个普通的Java领域博主,不停输出Java技术博客和干货 。 座右铭:锲而不舍,金石可镂 。 个人主页:五度鱼学Java的主页 在 Java 中, Bean 是一个重要的概念,它代表了应用程序中的一个对象。在开发中,我们经常使用 Bean 来管理对象的生命

    2024年01月16日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包