- 浏览: 43405 次
- 性别:
- 来自: 长沙
文章分类
最新评论
/* * JBoss, Home of Professional Open Source * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.seam.contexts; import java.util.Map; import java.util.Set; import org.jboss.seam.ScopeType; import org.jboss.seam.core.ConversationEntries; import org.jboss.seam.core.Manager; import org.jboss.seam.log.LogProvider; import org.jboss.seam.log.Logging; /** * Methods for setup and teardown of Seam contexts. * * @author Gavin King * @author <a href="mailto:theute@jboss.org">Thomas Heute</a> */ public class Lifecycle { private static final LogProvider log = Logging.getLogProvider(Lifecycle.class); private static ThreadLocal<Boolean> destroying = new ThreadLocal<Boolean>(); private static Map<String, Object> application; public static Map<String, Object> getApplication() { if (!isApplicationInitialized()) { throw new IllegalStateException("Attempted to invoke a Seam component outside an initialized application"); } return application; } public static boolean isApplicationInitialized() { return application!=null; } public static void beginApplication(Map<String, Object> app) { application = app; } public static void endApplication() { log.debug("Shutting down application and destroying contexts"); Context tempApplicationContext = new ApplicationContext( getApplication() ); Contexts.applicationContext.set(tempApplicationContext); Contexts.destroy(tempApplicationContext); Contexts.applicationContext.set(null); Contexts.eventContext.set(null); Contexts.sessionContext.set(null); Contexts.conversationContext.set(null); application = null; } public static void startDestroying() { destroying.set(true); } public static void stopDestroying() { destroying.set(false); } public static boolean isDestroying() { Boolean value = destroying.get(); return value!=null && value.booleanValue(); } public static void beginCall() { log.debug( ">>> Begin call" ); Contexts.applicationContext.set( new ApplicationContext(getApplication()) ); Contexts.eventContext.set( new BasicContext(ScopeType.EVENT) ); Contexts.sessionContext.set( new BasicContext(ScopeType.SESSION) ); Contexts.conversationContext.set( new BasicContext(ScopeType.CONVERSATION) ); Contexts.businessProcessContext.set( new BusinessProcessContext() ); } public static void endCall() { try { Contexts.destroy( Contexts.getSessionContext() ); Contexts.flushAndDestroyContexts(); if ( Manager.instance().isLongRunningConversation() ) { throw new IllegalStateException("Do not start long-running conversations in direct calls to EJBs"); } } finally { clearThreadlocals(); log.debug( "<<< End call" ); } } /** * @deprecated Use {@link Lifecycle#setupApplication()} */ @Deprecated public static void mockApplication() { setupApplication(); } /** * @deprecated Use {@link Lifecycle#cleanupApplication()} */ @Deprecated public static void unmockApplication() { cleanupApplication(); } public static void setupApplication() { Contexts.applicationContext.set( new ApplicationContext(getApplication()) ); } public static void cleanupApplication() { Contexts.applicationContext.set(null); } public static Context beginMethod() { Context result = Contexts.methodContext.get(); Contexts.methodContext.set( new BasicContext(ScopeType.METHOD) ); return result; } public static void endMethod(Context context) { Contexts.methodContext.set(context); } public static void endRequest() { log.debug("After request, destroying contexts"); try { Contexts.flushAndDestroyContexts(); } finally { clearThreadlocals(); log.debug( "<<< End web request" ); } } static void clearThreadlocals() { Contexts.eventContext.set(null); Contexts.pageContext.set(null); Contexts.sessionContext.set(null); Contexts.conversationContext.set(null); Contexts.businessProcessContext.set(null); Contexts.applicationContext.set(null); } public static void destroyConversationContext(Map<String, Object> session, String conversationId) { Contexts.destroyConversationContext(session, conversationId); } public static void beginSession(Map<String, Object> session) { log.debug("Session started"); //Normally called synchronously with a JSF request, but there are some //special cases! boolean applicationContextActive = Contexts.isApplicationContextActive(); boolean eventContextActive = Contexts.isEventContextActive(); boolean conversationContextActive = Contexts.isConversationContextActive(); if ( !applicationContextActive ) { Context tempApplicationContext = new ApplicationContext( getApplication() ); Contexts.applicationContext.set(tempApplicationContext); } Context oldSessionContext = Contexts.sessionContext.get(); Contexts.sessionContext.set( new SessionContext(session) ); //we have to use the session object that came in the sessionCreated() event Context tempEventContext = null; if ( !eventContextActive ) { tempEventContext = new BasicContext(ScopeType.EVENT); Contexts.eventContext.set(tempEventContext); } Context tempConversationContext = null; if ( !conversationContextActive ) { tempConversationContext = new BasicContext(ScopeType.CONVERSATION); Contexts.conversationContext.set(tempConversationContext); } Contexts.startup(ScopeType.SESSION); if ( !conversationContextActive ) { Contexts.destroy(tempConversationContext); Contexts.conversationContext.set(null); } if ( !eventContextActive ) { Contexts.destroy(tempEventContext); Contexts.eventContext.set(null); } Contexts.sessionContext.set(oldSessionContext); //replace the one from sessionCreated() with the one from JSF, or null if ( !applicationContextActive ) { Contexts.applicationContext.set(null); } } public static void endSession(Map<String, Object> session) { log.debug("End of session, destroying contexts"); //This code assumes that sessions are only destroyed at the very end of a //web request, after the request-bound context objects have been destroyed, //or during session timeout, when there are no request-bound contexts. if ( Contexts.isEventContextActive() || Contexts.isApplicationContextActive() ) { throw new IllegalStateException("Please end the HttpSession via org.jboss.seam.web.Session.instance().invalidate()"); } Context tempApplicationContext = new ApplicationContext( getApplication() ); Contexts.applicationContext.set(tempApplicationContext); //this is used just as a place to stick the ConversationManager Context tempEventContext = new BasicContext(ScopeType.EVENT); Contexts.eventContext.set(tempEventContext); //this is used (a) for destroying session-scoped components //and is also used (b) by the ConversationManager Context tempSessionContext = new SessionContext(session); Contexts.sessionContext.set(tempSessionContext); Set<String> conversationIds = ConversationEntries.instance().getConversationIds(); log.debug("destroying conversation contexts: " + conversationIds); for (String conversationId: conversationIds) { Contexts.destroyConversationContext(session, conversationId); } //we need some conversation-scope components for destroying //the session context... Context tempConversationContext = new BasicContext(ScopeType.CONVERSATION); Contexts.conversationContext.set(tempConversationContext); log.debug("destroying session context"); Contexts.destroy(tempSessionContext); Contexts.sessionContext.set(null); Contexts.destroy(tempConversationContext); Contexts.conversationContext.set(null); Contexts.destroy(tempEventContext); Contexts.eventContext.set(null); Contexts.applicationContext.set(null); } }
node:Contexts的外观,生命周期的预前后处理,例如application start时调用BeginApplication对上下文进行设置,他同时保存一个服务器级变量application,同时以保持一个与线程相关的destory标记,用来标记context是否被destory.例如.startDestory将destory set true,stopDesotry set false,可以用来判断某些Context是否destory,从而进行选择性处理.
发表评论
-
EntityBeanSet
2009-09-23 17:08 806package org.jboss.seam.contex ... -
EntityBeanMap
2009-09-23 17:07 837package org.jboss.seam.conte ... -
EntityBeanList
2009-09-23 17:03 628package org.jboss.seam.contex ... -
AbstractEntityBeanCollection
2009-09-23 16:59 767以容器方式保存钝化是EntityBeans pack ... -
EntityBean
2009-09-23 16:38 775EntityBean 主要用来保存一个Entity的对象 ... -
PassivatedEntity
2009-09-23 16:25 790注意:PersistenceContext未确切了解,是 ... -
SeamListener -- 设置有关Contexts上下文的入口
2009-08-01 17:02 846/* * JBoss, Home of Profess ... -
与Servlet相关的LifeCycle
2009-08-01 17:01 897/* * JBoss, Home of Profess ... -
Seam Contexts 核心
2009-08-01 16:46 1627/* * JBoss, Home of Profess ...
相关推荐
总结全文,强调Spring应用上下文生命周期的重要性以及理解其工作原理对于开发和维护Spring应用的意义。 了解Spring应用上下文的生命周期有助于我们更好地管理和控制Bean的行为,以及优化应用的性能和稳定性。在...
在实际开发中,应合理利用这些生命周期方法来处理各种场景,例如在`onCreateView()`中初始化视图,在`onStart()`或`onResume()`中启动定时器或监听器,在`onPause()`中停止可能占用资源的操作,在`onDestroy()`中...
7. **请求生命周期(Request Lifecycle)**:从请求到达服务器到响应返回客户端,RequestContext如何在整个过程中发挥作用,包括初始化、处理请求、响应生成和清理等阶段。 8. **自定义RequestContext**:开发者可能...
让我们深入了解一下Spring框架的生命周期及其相关的知识点。 在Spring中,bean的生命周期是指从创建到销毁的整个过程,它包括初始化、正常运行以及销毁三个阶段。这个小示例应用程序很可能是为了演示这些阶段的各种...
这个"activity-lifecycle"示例可能包含了一个或多个Activity,每个Activity对应生命周期的不同阶段,并通过日志打印或可视化方式显示状态变化。开发者可以调试这些Activity,观察每个方法的调用顺序,以便更好地理解...
- 初始化和删除EGL、上下文、表面和渲染资源的操作应在适当的生命周期阶段执行。 - 在渲染过程中,需要注意同步问题,确保UI线程和其他线程之间的通信不会导致应用崩溃或卡顿。 ### 用户操作和回调序列 用户操作会...
生命周期钩子会自动绑定 this 上下文到实例中,因此你可以访问数据,对 property 和方法进行运算。这意味着你不能使用箭头函数来定义一个生命周期方法(例如 created: () => this.fetchTodos())。 Vue 生命周期...
JavaServer Faces(JSF)...总的来说,JSF提供了一个强大的框架,通过组件、上下文、生命周期管理和事件处理机制,简化了Web应用程序的开发。理解这些基本概念是掌握JSF的关键,也是开发高效、可维护的应用程序的基础。
- `ApplicationContextAware`: 提供了对ApplicationContext的访问,使得Bean可以获取上下文信息,如其他Bean或资源。 2. 初始化阶段: 在Bean实例化并设置了所有依赖属性之后,Spring允许通过两种方式执行自定义...
在这个例子中,`AndroidLifecycleScopeProvider.from(this)` 将当前的上下文(可能是 Activity 或 Fragment)与 AutoDispose 连接,这样当这个上下文结束时,disposable 就会被自动清理。 AutoDispose 还支持 ...
至于压缩包内的文件"Lifecycle-master",这通常表明这是一个Git仓库的主分支克隆,可能包含了生命周期框架的源代码、文档、测试用例和其他相关资源。在Git仓库中,“master”分支通常代表项目的主线开发,是所有其他...
6. **第6章:生命周期(Lifecycle)** - **Lifecycle接口**:定义了组件生命周期的方法。 - **LifecycleEvent类**:用于触发生命周期事件。 - **LifecycleListener接口**:监听组件的生命周期变化。 通过以上...
This is a react contact manager built with react, context API, lifecycle methods and an admin dashboard. 入门git克隆这个项目进入项目npm安装npm开始会费嗨,要添加或删除功能,请创建一个PR `此处托管了该...
文档的某个部分提到了生命周期(Lifecycle)和生产后阶段(post-production phase)的各个阶段,这表明ISO/SAE 21434标准重点关注于车辆产品的整个生命周期内的网络安全管理,从产品开发到售后服务的每个阶段都需要...
这一职责由实现了Service接口和Lifecycle接口的StandardService类承担,它能够控制其组件的启动、停止等生命周期状态。 StandardService类中包含了对事件监听器的支持,这是设计模式中的Observer模式的应用,允许...
2. **请求处理**:当一个HTTP请求到达,Tomcat通过连接器(Connector)接收到请求,解析请求头和请求体,然后将请求转发给对应的Context(应用上下文)。 3. **路由到Servlet**:根据请求的URL,Tomcat查找匹配的...
Eclipse OSGi内核源码分析会涉及到OSGi规范的多个方面,例如服务注册(Service Registry)、生命周期管理(Lifecycle Management)、模块化和依赖解析(Modularity and Dependency Resolution)、以及动态化...
4. **生命周期(Lifecycle)**:JSF有六个阶段,从初始化到渲染响应,每个阶段都有特定的任务,如应用请求值、处理事件、更新模型值等。 5. **表达式语言(EL,Expression Language)**:JSF使用EL来访问后台bean的...
请求首先到达Engine(顶级Container),然后根据域名映射到Host,接着到Context(应用上下文),最后到Wrapper(Servlet实例)。\n\n2. 请求分发与处理\n\n当Connector接收到请求时,它会将请求对象封装成一个...
3. **Lifecycle**:JSF生命周期包括6个阶段:恢复视图、应用请求值、处理验证、更新模型值、调用应用逻辑和渲染响应。在每个阶段,MyFaces Core都会执行特定的任务,如解析请求参数、验证用户输入、更新模型对象等。...