`

Struts2的对象工厂(ObjectFactory)及其在Struts2与Spring整合中的作用

 
阅读更多

ObjectFactory,是xwork中很重要的一个类,是产生action的地方。单独使用xwork的时候,action都是这个类创建的。


后来Struts2包装了ObjectFactory,自成了一个StrutsObjectFactory,他是继承自ObjectFactory的一个类,因此Struts2默认产生action的类就不使用xwork的ObjectFactory了,而是使用StrutsObjectFactory

Struts2的插件struts2-spring-plugin-2.1.8.1.jar,又做了一个对象工厂,StrutsSpringObjectFactory,它的父类是xwork的SpringObjectFactory,最原始的父类也是ObjectFactory,我想xwork提供SpringObjectFactory的目的就是让实现这继承这个类,实现Spring工厂。

 

于是Struts2中也就是说有3个对象工厂,
org.apache.struts2.spring.StrutsSpringObjectFactory(Struts2的Spring插件提供)
org.apache.struts2.impl.StrutsObjectFactory(struts2自带)
com.opensymphony.xwork2.ObjectFactory(xwork自带)。
他们都可以用于产生action。

 

在xwork中默认使用ObjectFactory,在Struts2中默认使用StrutsObjectFactory。使用Struts2的Spring插件的时候默认使用StrutsSpringObjectFactory,这些都是自动的,其中前两个都是Struts2的内容。都是由

<constant name="struts.objectFactory" value="spring" />

来控制,这里的value,就是

<bean name="spring" type="com.opensymphony.xwork2.ObjectFactory" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />

 

在这bean里面定义的是哪个工厂,Struts2就用哪个工厂。

 

但是不管是哪个工厂最终这些都是有xwork控制完成的。
我们可以查看xwork的DefaultActionInvocation类的createAction(Map<String, Object> contextMap)方法。这个方法就是工厂对象产生action的方法。我们可以看到这个类中的定义的对象工厂是

protected ObjectFactory objectFactory;

然后没有实例化,而是通过xwork的注入机制注入

@Inject
public void setObjectFactory(ObjectFactory fac) {
      this.objectFactory = fac;
}

这个地方用的是最原始的ObjectFactory工厂,但是通过我们的配置为什么能变成StrutsSpringObjectFactory或StrutsObjectFactory呢?
这个还没有看完,但我想是多态造成的,因为ObjectFactory是StrutsSpringObjectFactory和StrutsObjectFactory的父类,可以用任意的子类实例化父类。我想是通过解读

<constant name="struts.objectFactory" value="spring" />
原文为 <constant name="struts.objectFactory" value="xia" />, 余认为不妥。

这个配置,来确定注入 ObjectFactory的那个子类。

 

 

我们可以在DefaultActionInvocation的createAction方法打印一下objectFactory
会发现,使用不同的对象工厂,那么这里会打印相应的工厂。绝对不只是ObjectFactory这个父类。

 

说明: 此文纯粹是从网络摘抄而来, 也根据此阅读了源码, 学习良多, 印象深刻, 特此分享之。

分享到:
评论

相关推荐

    Struts2整合Spring、JPA

    Struts2整合Spring和JPA是企业级Java应用开发中常见的技术组合,它们分别负责不同的职责:Struts2作为一款成熟的MVC框架,主要用于处理Web层的请求与响应;Spring作为一个全面的轻量级框架,提供了依赖注入(DI)和...

    struts2和Spring整合需要的jar包

    2. **配置Struts2**:在`struts.xml`配置文件中,我们需要配置Struts2与Spring的整合。添加`&lt;constant&gt;`标签,设置`struts.objectFactory`为`spring`,表明使用Spring作为对象工厂。 ```xml &lt;constant name="...

    Struts2与Spring之间的整合方法与原理

    Struts2与Spring之间的整合是企业级应用中常见的技术组合,因为它们分别提供了优秀的MVC框架支持和依赖注入(DI)及面向切面编程(AOP)能力。整合这两个框架可以使开发更加灵活,同时利用Spring的管理功能来增强...

    spring+struts2整合源码

    在Java Web开发中,Spring和Struts2是两个非常重要的框架。Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,而Struts2则以其优秀的MVC设计模式著称,两者结合可以构建出高效、可维护的Web应用。本文将...

    整合struts2和spring源代码(可以直接在tomcat中运行)

    Struts2与Spring的集成要用到Spring插件包struts2-spring-plugin-x-x-x.jar,这个包是同Struts2一起发布的。Spring插件是通过覆盖(override)Struts2的ObjectFactory来增强核心框架对象的创建。当创建一个对象的...

    SSH笔记-Spring整合Struts2

    在IT行业中,SSH(Spring、Struts2、Hibernate)是一个常见的企业级Web应用开发框架组合。这个框架集合了Spring的强大依赖注入(DI)和面向切面编程(AOP),Struts2的优秀MVC设计模式,以及Hibernate的高效持久化...

    Struts 2 整合Spring

    - 在 `applicationContext.xml` 文件中定义需要由 Spring 创建的 Bean,包括 Struts 2 的 Action 对象及其所需的依赖。 - 例如,在用户注册程序中,可以通过配置文件为 `RegisterAction` 注入 `UserDao`。 4. **...

    Spring+Struts2_整合原理

    在Spring与Struts2的整合过程中,Struts2 Spring插件(`struts2-spring-plugin`)起到了桥梁作用。该插件实现了Struts2的`ObjectFactory`接口,当Struts2框架需要创建Action实例时,会通过这个插件委托给Spring框架...

    struts2整合spring实现拦截器

    在本文中,我们将深入探讨如何实现Struts2与Spring的集成,以及利用拦截器来增强应用的功能。 首先,Struts2 是一个基于MVC设计模式的开源Web框架,它提供了强大的控制器层,使得开发者可以更方便地处理HTTP请求和...

    Spring整合Struts2

    本文将详细探讨如何整合Spring与Struts2,以及在整合过程中所需的最少jar包。 首先,理解Spring和Struts2的核心概念: 1. **Spring框架**:Spring通过提供IoC(Inversion of Control)容器来管理对象的生命周期和...

    Struts2整合Spring.docStruts2整合Spring.doc

    总的来说,Struts2 与 Spring 的整合主要是为了利用 Spring 的 IoC 容器来管理 Struts2 中的 Action 对象,简化对象的创建和依赖关系的管理,提高代码的可测试性和可维护性。通过合理的配置,开发者可以享受到两个...

    Myeclipse下整合springstruts2

    在`struts.xml`文件中,我们需要指定使用Spring作为对象工厂,这允许Struts2从Spring容器中获取Action实例。添加以下关键代码: ```xml &lt;constant name="struts.objectFactory" value="spring" /&gt; ...

    struts2和spring3注解整合问题

    需在`struts.xml`中添加`&lt;constant name="struts.objectFactory" value="org.apache.struts2.spring.StrutsSpringObjectFactory"/&gt;`来启用Spring插件,并且可能需要配置扫描注解的路径。 - **Action注解**:Action...

    Struts2+Spring4+Hibernate5整合

    在Struts2+Spring4整合中,Spring负责管理Action类及其依赖,使得应用更易于测试和解耦。 **Hibernate5** 是一个对象关系映射(ORM)框架,简化了数据库操作。它将Java对象与数据库表进行映射,使得开发者可以使用...

    Struts2与Spring2.5、Hibernate3三者整合

    在Java企业级开发中,Struts2、Spring和Hibernate这三大框架的整合是常见的技术栈,它们分别负责表现层、业务逻辑层和数据持久化层的功能。Struts2提供MVC架构,Spring则通过依赖注入(DI)和面向切面编程(AOP)来...

    Spring-Struts2项目环境搭建

    6. **整合Struts2和Spring**:在`struts.xml`中配置Spring插件,这样Struts2就可以从Spring容器中获取Action实例。 ```xml &lt;constant name="struts.objectFactory" value="org.springframework.web.struts.spring...

    struts2整合spring

    这两个库分别提供了Struts2与Spring整合的插件和Spring的核心功能。 接下来,配置Struts2以使用Spring作为ObjectFactory。有两种方法可以做到这一点: 1. 在`struts.properties`文件中设置`struts.objectFactory`...

    struts2与spring的整合

    通过以上步骤,我们可以成功地将Struts2与Spring进行整合,利用Spring的依赖注入功能来管理Struts2中的Action对象和其他业务组件,使得整个应用程序更加灵活和易于维护。这种整合方式不仅提高了代码的复用性和可测试...

    struts2与spring 最简单整合

    5. 开启Spring支持:在Struts2的配置文件中启用Spring插件,通常设置`&lt;constant name="struts.objectFactory" value="spring" /&gt;`。 6. 实例化Action:Struts2会通过Spring容器获取Action实例,实现依赖注入。 7. ...

    spring和struts的整合-aop的使用

    你需要在Struts2的配置文件中添加Spring插件的相关配置,如`&lt;constant name="struts.objectFactory" value="org.springframework.web.struts2.SpringObjectFactory"/&gt;`,这会让Struts2使用Spring来创建对象。...

Global site tag (gtag.js) - Google Analytics