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是核心组件,它负责加载配置,管理Bean的生命周期,并提供依赖注入。Quartz则是一个强大的任务调度库,可以用于计划和执行周期性任务。本篇文章将探讨如何结合Spring的...
Spring 框架是Java开发中的一个核心框架,它提供了全面的应用程序开发模型,旨在简化企业级应用的开发。这个框架以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)而...
Spring的这种设计使得我们可以方便地控制作业的生命周期,比如在应用启动时自动启动所有定时任务,或者在应用关闭时停止所有任务。此外,由于`QuartzJobBean`实现了`SmartLifecycle`接口,Spring可以根据应用的状态...
在手写MinIO 工具类的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 适合人群:具备一定编程基础,工作1-3年的研发人员...
- 调度器的生命周期应与Spring应用的生命周期保持一致,避免不必要的资源浪费。 - 如果任务涉及到数据库操作,确保Quartz配置文件中的数据库连接信息正确无误。 - 在生产环境中,考虑使用Quartz集群以提高可用性和...
将Quartz与Spring整合,可以利用Spring的IoC容器来管理Quartz的Job类,使Job的生命周期与Spring的bean一致,这样就能享受到Spring的诸多优势,如自动装配、事务管理等。下面我们将详细讲解如何在Spring中配置和使用...
- 集成方便:Spring容器可以管理Job的生命周期,包括依赖注入,使得Job可以访问Spring上下文中的其他bean。 3. **配置步骤** - 引入依赖:在项目中添加Quartz和Spring相关库的依赖。 - 创建SchedulerFactoryBean...
- 定时任务的执行依赖于Spring容器的生命周期,因此需要确保容器在任务执行期间保持运行。 - 如果使用`@Scheduled`注解,还需要配置一个`ThreadPoolTaskScheduler`或`ThreadPoolTaskExecutor`,以处理多线程任务...
1. spring-context.jar:Spring的核心容器,负责管理bean的生命周期。 2. spring-jdbc.jar:如果你的Quartz作业需要与数据库交互,这个是必需的。 3. quartz.jar:Quartz的主要库,包含了所有调度相关的类。 4. ...
Spring会自动管理Scheduler的生命周期,确保在应用启动时初始化,关闭时停止。 总结来说,Spring结合Quartz库,提供了一种高效且灵活的方式来实现定时任务。通过定义Job和Trigger,我们可以轻松地创建按需执行的...
Spring3的Inversion of Control(IoC)容器允许开发者通过配置来管理对象的生命周期和依赖关系。在集成Quartz时,我们可以将Quartz的Scheduler、Job、Trigger等组件作为Spring的bean来管理,这样可以利用Spring的...
在Spring中,我们可以使用Spring的JobDetail和Trigger来封装这些概念,使它们成为Spring管理的Bean,从而享受到Spring的依赖注入和生命周期管理。 集成Spring和Quartz的第一步是添加相关的依赖。在Maven项目中,你...
标题 "j2EE Spring Quartz" 暗示了我们即将探讨的是Java企业级应用开发中的一个关键组件——Spring框架与Quartz作业调度器的整合。Quartz是一个强大的、开源的作业调度框架,常用于在Java应用程序中安排任务执行。而...
- 使用Spring,你可以将Quartz的任务定义为Spring Bean,这样可以利用Spring的依赖注入和生命周期管理。 3. **Quartz核心概念** - **Job**:代表一个具体的任务,你需要实现`org.quartz.Job`接口并定义`execute`...
这样,你可以方便地在Spring容器中管理和控制定时任务的生命周期,例如启动、停止和更新任务。 总的来说,Spring Quartz提供了在Spring应用中集成定时任务的强大能力,使得开发者能够灵活地定义任务执行的时间表,...
这种方式对开发者要求较高,需要手动处理任务的生命周期和异常处理。 2. CronTrigger调度 CronTrigger是Quartz中的一种触发器类型,它允许你基于Cron表达式设置任务的执行时间。Cron表达式是一种字符串格式,用于...
- **易用性**:通过Spring的管理,服务的生命周期可以得到很好的控制,同时降低了服务的复杂性。 - **扩展性**:由于两者的开放性和社区支持,可以轻松地添加新的功能和集成其他框架。 综上所述,"CXF整合Spring...
这使得我们可以借助Spring的IoC(Inversion of Control)容器管理定时任务的生命周期。 要使用Quartz,我们首先需要在项目的`pom.xml`文件中添加Quartz和Spring的相关依赖。确保引入以下Maven坐标: ```xml ...
在上述示例中,Spring配置文件中的`jobDetail`和`cronTrigger`定义了一个定时任务,该任务每50分钟执行一次`simpleService.test()`方法。`schedulerTrigger`负责调度这些任务,根据配置的触发器列表启动相应的任务。...
这种方式需要更细致地控制 Job 的生命周期。 ```java public void execute(JobExecutionContext context) throws JobExecutionException { // 执行任务... // 关闭调度器 Scheduler scheduler = context....