当前位置: 首页 > news >正文

在Struts2中集成Spring详细讲解

Spring的官方定义是:一个轻量级的IoC和Aop容器框架,它使用了一种叫做依赖注入的技术。

所谓依赖注入,就是指将创建对象以及协议依赖对象之间合作的责任从对象自身中转移到“工厂”中去,这个“工厂”通常由IoC容器提供。

Struts2与Spring的集成要用到Spring插件包,这个包是同Struts2一起发布的。Spring插件是通过覆盖(override)Struts2的ObjectFactory来增强核心框架对象的创建。当创建一个对象的时候,它会用Struts2配置文件中的class属性去和Spring配置文件中的id属性进行关联,如果能找到则由Spring创建,否则由Struts2框架自身创建,然后由Spring来装配。Spring插件具体有如下几个作用:

1. 允许spring来创建Action、Interceptror和Result

2. 由Struts创建的对象能够被Spring装配

3. 提供了2个拦截器来自动装配action,如果没有使用Spring ObjectFactory的话

这里要注意的是,我们不必在Spring中去注册action,尽管我们可以这么去做,通常Struts框架会自动的从action mapping中创建action对象。

要实现与Struts与Spring的集成有如下几步

1.将struts2-spring-plugin-2.0.8.jar文件包含到我们的应用中,放到WEB-INF/lib目录下面即可。在这个插件包中有个struts-plugin.xml文件,它的内容如下:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code><struts>

    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" 

         class="org.apache.struts2.spring.StrutsSpringObjectFactory" />

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

    <package name="spring-default">

        <interceptors>

            <interceptor name="autowiring" 

class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>

            <interceptor name="sessionAutowiring"

class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>

        </interceptors>

    </package>    

</struts>

这里它将框架常量struts.objectFactory覆盖了,设置为”spring”,其实这里是使用了缩写,我们可以写全称:org.apache.struts2.spring.StrutsSpringObjectFactory。这个缩写的”spring”是和bean配置中的name属性相对应的。默认情况下所有由框架创建的对象都是由ObjectFactory实例化的,ObjectFactory提供了与其它IoC容器如Spring、Pico等集成的方法。覆盖这个ObjectFactory的类必须继承ObjectFactory类或者它的任何子类,并且要带有一个不带参数的构造方法。在这里我们用org.apache.struts2.spring.StrutsSpringObjectFactory代替了默认的ObjectFactory。

此外,上面我们说了,如果action不是使用Spring ObjectFactory创建的话,插件提供了两个拦截器来自动装配action,默认情况下框架使用的自动装配策略是name,也就是说框架会去Spring中寻找与action属性名字相同的bean,可选的装配策略还有:type、auto、constructor,我们可以通过常量struts.objectFactory.spring.autoWire来进行设置。

2.配置Spring监听器,将Spring.jar包包含到应用中

将下面一段话插入到web.xml文件中,同时将spring.jar文件放到WEB-INF/lib目录下面。

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code><listener>

    <listener-class>

        org.springframework.web.context.ContextLoaderListener

    </listener-class>

</listener>

3.利用Spring配置文件来注册对象

这之后的步骤就和我们使用单独使用Spring一样了,现在我们就已经完成了Struts与Spring的集成了。这里有一点要注意的是,我们还要指定Spring配置文件的地点,默认情况下,容器会到WEB-INF目录下面去寻找applicationContext.xml文件。如果我们想指定别的地方的配置文件或者指定多个配置文件,可以通过在web.xml文件中定义context-param元素来指定,如下所示:

<ccid_nobr></ccid_nobr>
<ccid_code></ccid_code><context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

        /WEB-INF/applicationContext.xml,classpath:applicationContext-*.xml

    </param-value>

</context-param>

上面一段话表示WEB-INF下面的applicationContext.xml文件以及classpath下面的所有匹配applicationContext-*.xml模式的文件都会作为Spring配置文件被装载。

转载于:https://www.cnblogs.com/sesexxoo/p/6190601.html

相关文章:

  • 如何提取浮点数的整数以及小数部分
  • 如何把PDF转成Excel
  • Android Audio System 之一:AudioTrack如何与AudioFlinger
  • Windows phone 8 学习笔记(1) 触控输入(转)
  • MongoDB权威指南学习笔记4---查询相关的知识点
  • Unity3d热更新全书-加载(一)从AssetBundle说起
  • JVM -XX: 参数介绍
  • 代码的坏味道之五 ——译自《重构》
  • 【转载】跨语言通信方案比较
  • 【WP 8.1开发】自定义(RAW)通知的使用
  • java 递归函数
  • jQuery Validation Engine 表单验证
  • GLES Shader Language 易错集锦
  • python的getopt
  • mac下mysql忘记root密码
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • Android框架之Volley
  • css属性的继承、初识值、计算值、当前值、应用值
  • Java知识点总结(JavaIO-打印流)
  • Linux后台研发超实用命令总结
  • Lsb图片隐写
  • nodejs调试方法
  • Objective-C 中关联引用的概念
  • rc-form之最单纯情况
  • React系列之 Redux 架构模式
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • v-if和v-for连用出现的问题
  • webpack项目中使用grunt监听文件变动自动打包编译
  • yii2权限控制rbac之rule详细讲解
  • 前端性能优化--懒加载和预加载
  • 如何设计一个比特币钱包服务
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 写给高年级小学生看的《Bash 指南》
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Mac 上flink的安装与启动
  • Prometheus VS InfluxDB
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #laravel 通过手动安装依赖PHPExcel#
  • $L^p$ 调和函数恒为零
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (LeetCode C++)盛最多水的容器
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (力扣)循环队列的实现与详解(C语言)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .apk 成为历史!
  • .net Signalr 使用笔记
  • .NET 的程序集加载上下文
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • .考试倒计时43天!来提分啦!
  • @JoinTable会自动删除关联表的数据
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [Android]常见的数据传递方式
  • [Angular] 笔记 20:NgContent