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 IoC容器**:Spring框架中的Inversion of Control(IoC)容器通过依赖注入管理Java Bean,可以自动创建、装配和管理Bean的生命周期。 - **AOP(面向切面编程)**:Spring还支持面向切面编程,允许在不...
2. 原型模式:在这种模式下,每次请求都会创建一个新的bean实例,这在需要多个实例或者短暂生命周期的对象时非常有用。 另外,Spring还支持对象工厂的延迟创建。这种机制允许我们在需要时才初始化bean,而不是在...
EJB容器负责管理Bean的生命周期、事务、安全性和资源,开发者只需关注业务逻辑。例如,容器自动处理并发访问,确保数据的一致性;提供声明式事务管理,简化事务处理。 5. **EJB 与现代Java EE** 随着Java EE演进...
3. **Filter**: Spring Session通过`DelegatingSessionFilter`,在HTTP请求生命周期内处理session的创建、读取、更新和删除操作。这个filter会替换默认的`HttpSession`实现,确保与存储层的交互。 4. **Redis配置**...
- **Bean生命周期管理**: - **合并Bean Definition**。 - **推断构造方法**。 - **实例化**。 - **属性填充**。 - **初始化前**。 - **初始化**。 - **初始化后**。 - 在初始化后步骤中可以实现AOP功能。 #...
4. **Spring生命周期管理**:你提到将方法托管给Spring后问题解决,这可能是因为Spring管理了bean的生命周期,确保了其持久性。在Spring中,你可以通过`@Scope("prototype")`来创建多实例,避免单例bean被容器误认为...
2. **容器管理的组件**:EJB容器提供了一系列的服务,如安全性、事务管理、生命周期管理等,开发者无需关注这些底层实现,只需专注于业务逻辑。 3. **无状态会话bean**:无状态会话bean不维护任何会话状态,每次...
J2EE容器是一种特殊的软件环境,它能够管理和控制J2EE应用程序中的组件,确保它们的正确运行和生命周期管理。容器提供了标准接口,让开发者无需关心底层的实现细节,可以专注于业务逻辑的编写。 J2EE容器主要有以下...
在SSH新闻系统中,Spring负责管理Bean的生命周期,包括Action类和其他业务服务类。此外,Spring还提供事务管理,即使在没有数据库的情况下,依然可以确保业务逻辑的一致性。 **Hibernate** 是一个对象关系映射(ORM...
部署后,EJB容器会管理Bean的生命周期,包括创建、查找、激活、钝化、销毁等阶段。 **4. EJB 3.x的改进** EJB 3.x引入了显著的变化,简化了API,减少了样板代码,使得EJB更加轻量级,更接近POJO(Plain Old Java ...
2. **EJB生命周期** - **创建**:由容器初始化并创建Bean实例。 - **激活**:当客户端首次调用Bean时,容器会激活它。 - **使用**:客户端可以通过接口方法与Bean进行交互。 - **钝化**:如果一段时间未被使用,...
6. **Servlet生命周期**:Servlet的生命周期包括初始化(init)、服务(service)、销毁(destroy)三个阶段。Servlet通过多线程方式处理请求,比CGI更高效,因为CGI每次请求都会创建新的进程。 7. **集合框架**:`...
理解Servlet生命周期(初始化、服务、销毁)和配置(web.xml)是学习Servlet的基础。 2. **JSP(JavaServer Pages)** JSP是一种动态网页技术,允许在HTML页面中嵌入Java代码。JSP页面在服务器端被转换成Servlet,...
2. Servlet编程:理解Servlet生命周期、请求和响应对象、过滤器和监听器的使用。 3. JSP技术:学习JSP语法、EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)的使用。 4. EJB技术:深入...
在这个系统中,Spring可能被用来管理Bean的生命周期,处理事务,以及提供数据访问接口。 5. **Hibernate**:Hibernate是一个流行的ORM(对象关系映射)框架,它使得Java对象可以直接操作数据库,减少了手动编写SQL...
- **容器服务(Container Services)**:J2EE容器提供了许多服务,如安全性、事务管理、调度、生命周期管理等,这些服务使得开发者可以专注于业务逻辑,而不必关心底层实现。 - **JNDI(Java Naming and Directory ...
**J2EE技术详解** J2EE(Java 2 Platform, Enterprise Edition)是Java平台上的一个企业...容器负责管理应用的生命周期,提供服务并确保组件的正确部署和运行。 10. **安全**:J2EE提供了全面的安全机制,包括角色基
12. **构建工具**:如Maven或Gradle,用于自动化构建、依赖管理和项目生命周期管理。了解如何编写POM.xml或build.gradle文件至关重要。 在“dj_J2EE”这个压缩包中,应包含了实现上述功能的相关源代码、配置文件...
- **容器外使用**:在非EJB环境中,需要手动管理实体Bean的生命周期,通常使用Spring框架来辅助管理。 ### 总结 EJB是Java平台上的企业级应用开发标准之一,通过提供一系列的服务和支持,极大地简化了复杂应用的...