seam中的组件和生命周期(从圈子转回来的)

seam依靠SeamListener监听器完成seam的初始化工作
维护seam状态的是一个Contexts类
Contexts内部维护着servlet容器的内置对象以及seam自己的状态内容

在servlet容器启动时,监听器(主线程)完成以下工作:
//将Lifecycle.application.servletContext指向ServletContext
//调用Scanner(实际上是URLScanner)扫描(寻找组件,这里使用了策略模式),在配置文件中寻找组件,并将结果维持在Initialization.componentDescriptors中(Initialization.create()和Initialization.init())
//Initialization.init()中的ServletLifecycle.beginInitialization()语句将Contexts.applicationContext维护的对象指向ServletContext
//Initialization.init()中的installComponents(init)语句将 Initialization.componentDescriptors中的组件以Component(包装了状态)对象形式存储在 Contexts.applicationContext维护的对象中(其实就是ServletContext的内存地址)
//清理Contexts状态
这样组件就保存在了ServletContext中

在session创建时,监听器(请求线程)完成以下工作:
//从ServletContext中(涉及到Lifecycle.application.servletContext和 Contexts.applicationContext维护的对象)将ScopeType.Sission范围的组件安装到HttpSession
//清理Contexts状态
这样组件就保存在了HttpSession中

seam的jsf生命周期监听器(请求线程)这样工作:
//将Contexts内部对象指向相应servlet内置对象(对话实际上由ConversationEntries.instance()维护,这里我不确定,以后再补上)。
//Contexts内部对象中取组件,如果为空,通过Contexts.applicationContext维护的对象中的Component创建组件。

说得比较粗糙,可能对粗略读过seam源代码的人有点用吧

补充:seam对话上下文也保存在HttpSession中,其以带有对话特有前缀的key作为区别,并由conversationContext.unflush(),conversationContext.flush()等方法维护。

关于线程的部分希望我没说错
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值