`

一分钟掌握Spring中bean的生命周期!

 
阅读更多

Spring 中bean 的生命周期短暂吗?

在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题。

然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例:例如:

 

在spring中,singleton属性默认是true,只有设定为false,则每次指定别名取得的Bean时都会产生一个新的实例

一个Bean从创建到销毁,如果是用BeanFactory来生成,管理Bean的话,会经历几个执行阶段(如图1.1):

 

 

1:Bean的建立:

容器寻找Bean的定义信息并将其实例化。

2:属性注入:

使用依赖注入,Spring按照Bean定义信息配置Bean所有属性

3:BeanNameAware的setBeanName():

如果Bean类有实现org.springframework.beans.BeanNameAware接口,工厂调用Bean的setBeanName()方法传递Bean的ID。

4:BeanFactoryAware的setBeanFactory():

如果Bean类有实现org.springframework.beans.factory.BeanFactoryAware接口,工厂调用setBeanFactory()方法传入工厂自身。

5:BeanPostProcessors的ProcessBeforeInitialization()

如果有org.springframework.beans.factory.config.BeanPostProcessors和Bean关联,那么其postProcessBeforeInitialization()方法将被将被调用。

6:initializingBean的afterPropertiesSet():

如果Bean类已实现org.springframework.beans.factory.InitializingBean接口,则执行他的afterProPertiesSet()方法

7:Bean定义文件中定义init-method:

可以在Bean定义文件中使用"init-method"属性设定方法名称例如:

 

如果有以上设置的话,则执行到这个阶段,就会执行initBean()方法

8:BeanPostProcessors的ProcessaAfterInitialization()

如果有任何的BeanPostProcessors实例与Bean实例关联,则执行BeanPostProcessors实例的ProcessaAfterInitialization()方法

此时,Bean已经可以被应用系统使用,并且将保留在BeanFactory中知道它不在被使用。有两种方法可以将其从BeanFactory中删除掉(如图1.2):

 

 

1:DisposableBean的destroy()

在容器关闭时,如果Bean类有实现org.springframework.beans.factory.DisposableBean接口,则执行他的destroy()方法

2:Bean定义文件中定义destroy-method

在容器关闭时,可以在Bean定义文件中使用"destroy-method"属性设定方法名称,例如:

 

如果有以上设定的话,则进行至这个阶段时,就会执行destroy()方法,如果是使用ApplicationContext来生成并管理Bean的话则稍有不同,使用ApplicationContext来生成及管理Bean实例的话,在执行BeanFactoryAware的setBeanFactory()阶段后,若Bean类上有实现org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法,接着才执行BeanPostProcessors的ProcessBeforeInitialization()及之后的流程。

分享到:
评论

相关推荐

    利用spring的ApplicationContext在程序中唤醒quartz的job

    在Spring框架中,ApplicationContext是核心组件,它负责加载配置,管理Bean的生命周期,并提供依赖注入。Quartz则是一个强大的任务调度库,可以用于计划和执行周期性任务。本篇文章将探讨如何结合Spring的...

    spring知识点讲解

    Spring 框架是Java开发中的一个核心框架,它提供了全面的应用程序开发模型,旨在简化企业级应用的开发。这个框架以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)而...

    spring-support.jar

    Spring的这种设计使得我们可以方便地控制作业的生命周期,比如在应用启动时自动启动所有定时任务,或者在应用关闭时停止所有任务。此外,由于`QuartzJobBean`实现了`SmartLifecycle`接口,Spring可以根据应用的状态...

    Spring Boot 集成 MinIO(分布式对象存储系统)

    在手写MinIO 工具类的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员...

    spring3.1 与 quartz 1.8.6 整合 所有jar

    - 调度器的生命周期应与Spring应用的生命周期保持一致,避免不必要的资源浪费。 - 如果任务涉及到数据库操作,确保Quartz配置文件中的数据库连接信息正确无误。 - 在生产环境中,考虑使用Quartz集群以提高可用性和...

    Spring Quartz 调度器

    将Quartz与Spring整合,可以利用Spring的IoC容器来管理Quartz的Job类,使Job的生命周期与Spring的bean一致,这样就能享受到Spring的诸多优势,如自动装配、事务管理等。下面我们将详细讲解如何在Spring中配置和使用...

    spring3-quartz1.x

    Spring3的Inversion of Control(IoC)容器允许开发者通过配置来管理对象的生命周期和依赖关系。在集成Quartz时,我们可以将Quartz的Scheduler、Job、Trigger等组件作为Spring的bean来管理,这样可以利用Spring的...

    spring的quartz使用实例

    - 集成方便:Spring容器可以管理Job的生命周期,包括依赖注入,使得Job可以访问Spring上下文中的其他bean。 3. **配置步骤** - 引入依赖:在项目中添加Quartz和Spring相关库的依赖。 - 创建SchedulerFactoryBean...

    spring定时器demo

    - 定时任务的执行依赖于Spring容器的生命周期,因此需要确保容器在任务执行期间保持运行。 - 如果使用`@Scheduled`注解,还需要配置一个`ThreadPoolTaskScheduler`或`ThreadPoolTaskExecutor`,以处理多线程任务...

    spring 引入 quartz 需要的jar以及如何配置

    1. spring-context.jar:Spring的核心容器,负责管理bean的生命周期。 2. spring-jdbc.jar:如果你的Quartz作业需要与数据库交互,这个是必需的。 3. quartz.jar:Quartz的主要库,包含了所有调度相关的类。 4. ...

    spring-timer-quartz.zip_namegnd_spring定时任务

    Spring会自动管理Scheduler的生命周期,确保在应用启动时初始化,关闭时停止。 总结来说,Spring结合Quartz库,提供了一种高效且灵活的方式来实现定时任务。通过定义Job和Trigger,我们可以轻松地创建按需执行的...

    Spring quartz整合

    在Spring中,我们可以使用Spring的JobDetail和Trigger来封装这些概念,使它们成为Spring管理的Bean,从而享受到Spring的依赖注入和生命周期管理。 集成Spring和Quartz的第一步是添加相关的依赖。在Maven项目中,你...

    j2ee spring quartz

    标题 "j2EE Spring Quartz" 暗示了我们即将探讨的是Java企业级应用开发中的一个关键组件——Spring框架与Quartz作业调度器的整合。Quartz是一个强大的、开源的作业调度框架,常用于在Java应用程序中安排任务执行。而...

    spring定时器Quartz

    - 使用Spring,你可以将Quartz的任务定义为Spring Bean,这样可以利用Spring的依赖注入和生命周期管理。 3. **Quartz核心概念** - **Job**:代表一个具体的任务,你需要实现`org.quartz.Job`接口并定义`execute`...

    quartz3种调度形式+传参.zip

    这种方式对开发者要求较高,需要手动处理任务的生命周期和异常处理。 2. CronTrigger调度 CronTrigger是Quartz中的一种触发器类型,它允许你基于Cron表达式设置任务的执行时间。Cron表达式是一种字符串格式,用于...

    SpringQuartz定时器的配置[参照].pdf

    这样,你可以方便地在Spring容器中管理和控制定时任务的生命周期,例如启动、停止和更新任务。 总的来说,Spring Quartz提供了在Spring应用中集成定时任务的强大能力,使得开发者能够灵活地定义任务执行的时间表,...

    CXF整合spring的客户端和服务端

    - **易用性**:通过Spring的管理,服务的生命周期可以得到很好的控制,同时降低了服务的复杂性。 - **扩展性**:由于两者的开放性和社区支持,可以轻松地添加新的功能和集成其他框架。 综上所述,"CXF整合Spring...

    spring--quartz的定时调度的maven部署

    这使得我们可以借助Spring的IoC(Inversion of Control)容器管理定时任务的生命周期。 要使用Quartz,我们首先需要在项目的`pom.xml`文件中添加Quartz和Spring的相关依赖。确保引入以下Maven坐标: ```xml ...

    Spring Quartz集成

    在上述示例中,Spring配置文件中的`jobDetail`和`cronTrigger`定义了一个定时任务,该任务每50分钟执行一次`simpleService.test()`方法。`schedulerTrigger`负责调度这些任务,根据配置的触发器列表启动相应的任务。...

    quartz 随tomcat启动执行一次

    这种方式需要更细致地控制 Job 的生命周期。 ```java public void execute(JobExecutionContext context) throws JobExecutionException { // 执行任务... // 关闭调度器 Scheduler scheduler = context....

Global site tag (gtag.js) - Google Analytics