本文讲述Seam组件的初始化和实例化过程。
初始化seam组件
SeamListener.contextInitialized(...)
new Initialization(servletContext).create().init();
Initialization.create()
StandardDeploymentStrategy.scan();
通过UrlScanner 扫描包含 seam.properties, META-INF/seam.properties 或 META-INF/components.xml的文件夹和jar文件。
ComponentDeploymentHandler.handle(...)
针对每一个扫描到的ClassFile, 如满足以下两个条件,则标记为seam 组件:
1. 有@Name标注或有一个同名的.component.xml文件存在;
2. 无@Install标注或有@Install 标注且 value = false;
initComponentsFromXmlDocument("/WEB-INF/components.xml")
安装WEB-INF/components.xml中定义的组件;
initComponentsFromXmlDocuments();
安装所有META-INF/components.xml中定义的组件;
Initialization.init()
scanForComponents()
安装StandardDeploymentStrategy扫描到的seam组件;
addComponent( new ComponentDescriptor(Init.class), ...)
安装Init组件;
addSpecialComponents(init)
安装PojoCache组件;
installComponents(init)
安装依赖组件?
Initialization.addComponent(descriptor, context)
component = new Component(...);
context.set(componentName, component);
所有的Seam组件都安装到了ApplicationContext中了.下面我们来看如何获得组件。
Seam组件的实例化
即然组件交由seam来管理,那么就不能使用new来实例化了,必须通过Component对象来完成。
Component.newInstance()
instance = instantiate();
if (getScope()!=STATELESS) {
//存入Context,
getScope().getContext().set(name, instance);
......
}
Component.instantiate()
switch(type) {
case JAVA_BEAN:
return instantiateJavaBean();
case ENTITY_BEAN:
return instantiateEntityBean();
case STATELESS_SESSION_BEAN:
case STATEFUL_SESSION_BEAN:
return instantiateSessionBean();
......
}
根据组件的类型执行不同的实例化操作。
Pojo组件的实例化
Component.instantiateJavaBean()
Object bean = getBeanClass().newInstance();
if (!interceptionEnabled) {
initialize(bean);
callPostConstructMethod(bean);
}
else {
JavaBeanInterceptor interceptor = new JavaBeanInterceptor(bean, this);
bean = wrap(bean, interceptor); // 创建Proxy对象
interceptor.postConstruct(); // 由PostConstruct调用initialize(bean)
}
判断此组件是否允许被Interceptor,这由BypassInterceptors描述决定,
如允许被Interceptor,则创建Proxy对象并加入interceptor对象,
有关Interceptor的内容我们将在下一篇文章中详述。
Entity组件的实例化
Component.instantiateEntityBean()
Object bean = getBeanClass().newInstance();
initialize(bean);
Session组件的实例化
Component.instantiateSessionBean()
Object bean = Naming.getInitialContext().lookup(jndiName);
return wrap(bean, new ClientSideInterceptor(bean, this));
Session组件由JNDI进行管理,获得Session组件后,创建一个Proxy对象对它进行封装,
ClientSideInterceptor为客户端的拦截器。
Seam组件的调用
通过Component类,可以非常容易的获得seam组件,查找的顺序如下:
1. Seam从给定的Scope Context中查找,如未指定Scope,则查找所有Context;
2. 如未找到组件,则查找是否有工厂方法;
3. 如未找到工厂方法,则使用newInstance方法实例化组件并存入相应Scope的Context中;
4. unwrap组件;
Component.getInstance(name)
// 查找所有Context
Object result = Contexts.lookupInStatefulContexts(name);
result = getInstance(name, create, result);
return result;
Component.getInstance(name, scope)
// 查找scope的Context
Object result = scope==STATELESS ? null : scope.getContext().get(name);
result = getInstance(name, create, result);
return result;
Component.getInstance(name, create, result)
if (result == null && create) {
// 通过工厂模式创建.
result = getInstanceFromFactory(name);
if (result == null) {
if (component== null) {
}
else if (component.getScope().isContextActive()) {
// 检查Context是否为激活状态
result = component.newInstance();
}
}
if (result != null) {
if (component != null) {
if (!component.isInstance(result)) {
// 检查result为有效的bean实例
if (component.hasUnwrapMethod())
return result;
}
result = component.unwrap(result);
}
}
return result;
}
分享到:
相关推荐
1.3. Seam 中的可点击列表:消息示例............................................................................................................................. 27 1.3.1. 理解代码.........................
3. **核心组件**:深入探讨了JBoss Seam的关键组件,如Conversation Scope、Event System、Component Model等,并解释了它们如何协同工作以实现复杂的业务逻辑。 4. **Web 2.0应用开发**:讲解了如何利用JBoss ...
- **Component Context**:管理Seam组件的实例,确保每个请求或会话有独立的组件实例。 - **Event Context**:处理事件的发布和订阅,允许组件之间的通信。 **2. 依赖注入(Dependency Injection, DI)** Seam的DI...
在Seam中,组件(Component)是核心概念,它不仅包括了传统的MVC(Model-View-Controller)模型中的所有元素,还引入了“会话”(Conversation)的概念,使得组件能够在多个请求之间保持状态,从而实现更复杂的交互...
《Practical JBoss Seam》是一本深入探讨JBoss Seam框架技术的书籍,其源代码包含在提供的压缩包中。Seam是一种开源的企业级Java框架,它整合了多种技术和概念,如JavaServer Faces (JSF)、Java Persistence API ...
Java培训课程-JBOSS-SEAM开发主要涵盖了Java企业级应用开发中的关键技术和框架,特别是JBOSS SEAM的应用。SEAM是一个全面的Java EE框架,旨在简化开发过程,提高开发效率,同时提供了丰富的功能来处理复杂的业务逻辑...
在探讨JBOSS SEAM开发之前,我们首先理解为何SEAM框架成为Java Web应用开发中的优选。SEAM提供了诸多优势,使其在众多框架中脱颖而出: 1. **增加AJAX特性**:SEAM通过简化AJAX的使用,让开发者能够迅速在应用程序...
Seam入门部分介绍了如何在不同的服务器环境中部署和运行Seam应用实例,包括JBoss AS和Tomcat服务器。 **1.1.1 在JBoss AS上运行示例** 在JBoss AS上部署和运行Seam应用,首先需要确保JBoss AS服务器已经正确安装并...
Beyond coverage of the core application server, the book also teaches how to use some of the "hot" technologies that run on top of the application server, such as Jboss Seam and JBoss Portal....
关于Seam,书里会详细讲解其核心概念,如Component、Conversation、Injection等,并通过实例展示如何创建和管理Seam应用。 书中可能涵盖以下内容: 1. JBoss安装与配置:详细步骤指导,包括系统需求、下载、解压、...
**JBoss Seam** 是一个针对 Java EE 的应用框架,旨在通过统一组件架构简化 Web 应用程序的开发过程。Seam 构建在 EJB 3 规范的基础上,充分利用了该规范中的创新变化,如注解而非容器接口、异常配置而非冗长的 XML ...
如果项目中使用了JBoss Seam框架,还需要额外配置以确保与RichFaces兼容。具体配置可参考JBoss Seam官方文档。 ### 四、RichFaces框架的基本概念 #### 4.1 引言 RichFaces是一个强大的Ajax框架,它扩展了JSF标准...
- **JBoss Seam 支持**:与 JBoss Seam 框架的兼容性配置。 #### 八、与 IDE 集成 - Ajax4jsf 支持与多种集成开发环境 (IDE) 的集成,如 Eclipse、NetBeans、IntelliJ IDEA 等,方便开发人员进行开发调试。 #### ...
**附加设置**:包括Web应用程序描述符参数、Sun JSF RI、Apache MyFaces Facelets的支持,以及与JBoss Seam的集成。 **IDE集成**:提供与开发环境的集成指南,帮助开发者更便捷地使用Ajax4JSF。 **资源列表**:列...
- **JBoss Seam 支持**: 与 JBoss Seam 框架集成。 #### 八、与 IDE 集成 - **Eclipse**: 提供插件支持。 - **NetBeans**: 集成开发环境支持。 - **IntelliJ IDEA**: 支持集成开发环境。 #### 九、Exadel VCP 和 ...
如果应用程序使用了JBoss Seam框架,则需要在`web.xml`文件中配置`seam-integration`过滤器,并在`faces-config.xml`中添加对Seam的支持。 ##### 3.6 Portlet支持 当开发portlet时,需要确保portlet容器支持AJAX,...
此外,还支持JBoss Seam等框架,以增强应用的功能性和灵活性。 ##### 2.3 支持的服务器 支持的服务器包括但不限于: - **Apache Tomcat** - **JBoss AS / WildFly** - **GlassFish** - **WebLogic** - **...
- Sun JSF RI、Apache MyFaces、Facelets支持、JBoss Seam支持等特定设置。 - 针对不同JSF实现的特定配置项。 #### 八、与IDE集成 - **IDE集成**:支持与Eclipse、NetBeans等流行开发环境的集成,提高开发效率。 ...
同时,确保你的服务器也在Ajax4JSF的支持列表中,例如Tomcat、JBoss等。对于浏览器,Ajax4JSF通常支持主流的现代浏览器。 **下载与安装**:从官方网站或其他可靠来源下载Ajax4JSF的最新版本,然后按照文档指示将其...