- 浏览: 633348 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
liuche20083736:
非常好
从问题看本质: 研究TCP close_wait的内幕 -
xiaopohai85707:
优化算法与原来需求不符
过滤字符的性能调优?挤一挤还是有的 -
kmy_白衣:
生成的area图有时候 标签的数值和图标上看上去的数值不一致。 ...
OpenFlashChart2之恶心文档 -
tom&jerry:
大神,请教一个问题,按名称排序为何无效,用的2.4.3 XPA ...
深入浅出jackrabbit之十三 查询之AST和QT -
jd2bs:
改成精确匹配可以了< filter-mapping &g ...
细谈Ehcache页面缓存的使用
[size=small]/**
*作者:张荣华(ahuaxuan)
*日期:2008-4-9
**/
1背景
Spring2.5支持使用annotation来配置我们的service,比如如下代码:
这样就表示这个service需要被spring管理,不过只是这样做是不够的,我们还需要在applicationcontext***.xml中加入这么一段:
这么一来这个xxxxxxx包下所有的使用@Service这个注释的对象都会自动的被spring管理。
虽然这样看上去很美好,但是却是不满足我们的需求的,因为我们的service中,或者其他被管理的bean中有时候需要一些配置,比如说String,Integer等等,而且这些配置的值一般都来自Properties文件,一般情况下我们会使用如下这段代码:
这样我们就可以通过${}来引用到properties文件中的值。
不过使用了@service之后,我们就无法通过${}来得到properties中的值了。downpour是spring2.5使用的先行者,他很早就意识到这个问题,通过我们的讨论,确定了解决问题的方向。下面我把这个方案拿出来和大家共享。
2目标:
我们的目标是实现一个Annotation,代码如下:
pic.address和pic.url是properties文件中的两个属性
以上代码中的@Properties就是我们要实现的Annotation,通过name的值作为key去对应的properties中寻找对应的value,并且主动赋值给ImageFileUpload的对应属性。
3步骤:
我们知道,spring在初始化完bean之后我们可以对这些bean进行一定的操作,这里就是一个扩展点,我决定使用BeanPostProcessor这个接口,这个接口中有一个postProcessAfterInitialization方法就是用来做bean的后处理的,一旦一个bean被初始化完成之后,我们就可以对这个bean进行赋值了。
但是考虑到我们项目中不是所有的bean都使用Annotation来注册到spring中的,这些普通的,配置在xml文件中的bean也有用到${}的需求,所以我考虑扩展PropertyPlaceholderConfigurer这个类。我们来分析一下具体的代码。
首先建立一个Annotation,如下:
接着我们实现我们的扩展主类:
最后我们需要在xml文件中配置一下:
这样任何一个bean,不管它是使用annotation注册的,还是直接配置在xml文件中的都可以使用这种方式来注入properties中的值。
下面看一下我在项目中的一个真实的例子,这个类是一个value object,它代表一组配置:
那么在需要用到该vo的地方比如:
就这么多内容就ok了,如果按照原来的办法,我们就需要在xml配置以上两个bean,然后在里面写一堆又一堆的${},肯定能让你看了之后崩溃,至少我差点崩溃,因为它看上去实在是太丑陋了。而现在,我的心情好多了,因为我用这个@Properties(name = "")用的很爽,呵呵,而且即使有些bean是配置在xml文件中的,比如datasource等等,我们还是可以通过${}来进行设值,也就是说这个方案既支持annotation,也支持${},很好,很强大。
结语:
很显然,在spring2.5的时代,以上这个需求是非常平常的,我相信在spring3.0中一定会提供这样的功能,而且我觉得spring2.5应该是一个过渡版本,虽然上面的方案中代码行数并不多,但是我觉得很有价值,应该很有市场才对,也许我们可以把这个东东叫做spring-properties2object-plugin。
题外话:
说点题外话吧,目前在我的项目里,我使用了struts2.0+spring2.5+hibernate3.2,使用struts2.0的时候我使用struts2.0的zero configuration和codebehind,基本上实现了真正意义零配置,剩下的都是一些common的配置,而且很少,不超过150行。在使用spring的时候,我也基本上是使用annotation来注册我的bean,同时使用上面的方案来作为补充,所以applicationContext-xxx.xml中的也是一些common的配置,也是非常少,应该只有200行左右。而hibernate我是使用annotation来配置我的PO,基本没有配置文件。所以整个项目的xml文件中配置的总行数大大下降。
[/size]
请问有没有在这个设计基础上的成型代码?
等分散到package之后,或许有一天你又会想把它们都集中管理,放入某个xml里边,这个xml名字或许可以叫做package-class-mapping.xml 简称pcm跟hibernate的hbm对应,可以一个文件放一个vo设置,或者根据package放置多个vo设置,总之随你心意:)
请问有没有在这个设计基础上的成型代码?
是说不同包内有同样的设置文件,但是里面的内容不同?
目前我的开发里没有这种需求。如果是开发和生产环境要用不同的代码,可以把不同的文件放进classpath,然后读取classpath里面的文件。
比如test/config/server.properties和main/config/properties,测试环境用前者,生产环境用后者
上面的设置代码在spring只是一段配置?
你指的是setProperty么?我只是写个testcase举例,真正的环境自然是读取property文件。
区别在于,spring要做你写的那些东西,而guice不需要。
*作者:张荣华(ahuaxuan)
*日期:2008-4-9
**/
1背景
Spring2.5支持使用annotation来配置我们的service,比如如下代码:
@Service("userService") public class UserServiceImpl extends BaseServiceSupport implements UserService { public void xxx() { } }
这样就表示这个service需要被spring管理,不过只是这样做是不够的,我们还需要在applicationcontext***.xml中加入这么一段:
<context:component-scan base-package="xxxxxxx"/>
这么一来这个xxxxxxx包下所有的使用@Service这个注释的对象都会自动的被spring管理。
虽然这样看上去很美好,但是却是不满足我们的需求的,因为我们的service中,或者其他被管理的bean中有时候需要一些配置,比如说String,Integer等等,而且这些配置的值一般都来自Properties文件,一般情况下我们会使用如下这段代码:
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean>
这样我们就可以通过${}来引用到properties文件中的值。
不过使用了@service之后,我们就无法通过${}来得到properties中的值了。downpour是spring2.5使用的先行者,他很早就意识到这个问题,通过我们的讨论,确定了解决问题的方向。下面我把这个方案拿出来和大家共享。
2目标:
我们的目标是实现一个Annotation,代码如下:
@Service public class ImageFileUpload implements Serializable { @Properties(name="pic.address" ) private String picAddress; @Properties(name="pic.url" ) private String picUrl; private String picServerUrl; }
pic.address和pic.url是properties文件中的两个属性
以上代码中的@Properties就是我们要实现的Annotation,通过name的值作为key去对应的properties中寻找对应的value,并且主动赋值给ImageFileUpload的对应属性。
3步骤:
我们知道,spring在初始化完bean之后我们可以对这些bean进行一定的操作,这里就是一个扩展点,我决定使用BeanPostProcessor这个接口,这个接口中有一个postProcessAfterInitialization方法就是用来做bean的后处理的,一旦一个bean被初始化完成之后,我们就可以对这个bean进行赋值了。
但是考虑到我们项目中不是所有的bean都使用Annotation来注册到spring中的,这些普通的,配置在xml文件中的bean也有用到${}的需求,所以我考虑扩展PropertyPlaceholderConfigurer这个类。我们来分析一下具体的代码。
首先建立一个Annotation,如下:
/** * @author ahuaxuan(aaron zhang) * @since 2008-4-7 * @version $Id: Properties.java 261 2008-04-07 07:03:41Z aaron $ */ @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Properties { // String bundle(); String name(); }
接着我们实现我们的扩展主类:
/** * @author ahuaxuan(aaron zhang) * @since 2008-4-7 * @version $Id: AnnotationBeanPostProcessor.java 260 2008-04-07 07:03:35Z aaron $ */ public class AnnotationBeanPostProcessor extends PropertyPlaceholderConfigurer implements BeanPostProcessor, InitializingBean { private static transient Log logger = LogFactory.getLog(AnnotationBeanPostProcessor.class); private java.util.Properties pros; @SuppressWarnings("unchecked") private Class[] enableClassList = {String.class}; @SuppressWarnings("unchecked") public void setEnableClassList(Class[] enableClassList) { this.enableClassList = enableClassList; } public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { Field [] fields = bean.getClass().getDeclaredFields(); for (Field field : fields) { if (logger.isDebugEnabled()) { StringBuilder sb = new StringBuilder(); sb.append(" ========= ") .append(field.getType()) .append(" ============ ") .append(field.getName()) .append(" ============ ") .append(field.isAnnotationPresent(Properties.class)); logger.debug(sb.toString()); } if (field.isAnnotationPresent(Properties.class)) { if (filterType(field.getType().toString())) { Properties p = field.getAnnotation(Properties.class); try { // StringBuilder sb = new StringBuilder(); // sb.append("set").append(StringUtils.upperCase(field.getName().substring(0, 1))) // .append(field.getName().substring(1, field.getName().length())); // // Method method = bean.getClass().getMethod(sb.toString(), String.class); // method.invoke(bean, pros.getProperty(p.name())); 本来我是通过set方法来把properties文件中的值注入到对应的属性上去的,后来downpour提供了更好的方案,就是下面这两行代码,虽然这样做破坏了private的功能,同时破坏了封装,但是确实节省了很多代码,建议大家在业务代码中不要这样做,如果做框架代码可以考虑一下。 ReflectionUtils.makeAccessible(field); field.set(bean, pros.getProperty(p.name())); } catch (Exception e) { logger.error(" --- ", e); } } } } return bean; } @SuppressWarnings("unchecked") private boolean filterType(String type) { if (type != null) { for (Class c : enableClassList) { if (c.toString().equals(type)) { return true; } } return false; } else { return true; } } public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } public void afterPropertiesSet() throws Exception { pros = mergeProperties(); } }
最后我们需要在xml文件中配置一下:
<bean id="propertyConfigurer" class="xx.service.AnnotationBeanPostProcessor"> <property name="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> </bean>
这样任何一个bean,不管它是使用annotation注册的,还是直接配置在xml文件中的都可以使用这种方式来注入properties中的值。
下面看一下我在项目中的一个真实的例子,这个类是一个value object,它代表一组配置:
@Component public class Config implements Serializable{ /** */ private static final long serialVersionUID = 8737228049639915113L; @Properties(name = " online.pay.accounts") private String accounts; @Properties(name = " online.pay.user") private String user; @Properties(name = " online.pay.password") private String password; @Properties(name = " online.transurl") private String transUrl; @Properties(name = " online.refundurl") private String refundUrl; @Properties(name = " online.query") private String queryUrl; ```setter and getter method }
那么在需要用到该vo的地方比如:
@Service(“userService”) public class UserServiceImpl implements UserService { @autowired private Config config; public void setConfig(Config config) { This.config = config; } }
就这么多内容就ok了,如果按照原来的办法,我们就需要在xml配置以上两个bean,然后在里面写一堆又一堆的${},肯定能让你看了之后崩溃,至少我差点崩溃,因为它看上去实在是太丑陋了。而现在,我的心情好多了,因为我用这个@Properties(name = "")用的很爽,呵呵,而且即使有些bean是配置在xml文件中的,比如datasource等等,我们还是可以通过${}来进行设值,也就是说这个方案既支持annotation,也支持${},很好,很强大。
结语:
很显然,在spring2.5的时代,以上这个需求是非常平常的,我相信在spring3.0中一定会提供这样的功能,而且我觉得spring2.5应该是一个过渡版本,虽然上面的方案中代码行数并不多,但是我觉得很有价值,应该很有市场才对,也许我们可以把这个东东叫做spring-properties2object-plugin。
题外话:
说点题外话吧,目前在我的项目里,我使用了struts2.0+spring2.5+hibernate3.2,使用struts2.0的时候我使用struts2.0的zero configuration和codebehind,基本上实现了真正意义零配置,剩下的都是一些common的配置,而且很少,不超过150行。在使用spring的时候,我也基本上是使用annotation来注册我的bean,同时使用上面的方案来作为补充,所以applicationContext-xxx.xml中的也是一些common的配置,也是非常少,应该只有200行左右。而hibernate我是使用annotation来配置我的PO,基本没有配置文件。所以整个项目的xml文件中配置的总行数大大下降。
[/size]
评论
35 楼
frenchleaf
2009-01-20
能不能给个源码例子啊
34 楼
frenchleaf
2009-01-20
太帅了,正在用CXF+Spring,正需要这个
33 楼
neptune
2009-01-13
用了,并自己修改了一下,非常好
32 楼
swantt
2008-11-10
不太好吧.
31 楼
swantt
2008-11-10
为什么都要用annotation啊. 晕.
30 楼
leon1509
2008-10-23
按楼主的方法写完,值没注入进去!
29 楼
Jellee
2008-07-10
有一些正在用~
但有一些还真的没有尝试过~ 找空试一下...
又偷学到东西了... 嘻嘻~
但有一些还真的没有尝试过~ 找空试一下...
又偷学到东西了... 嘻嘻~
28 楼
davidcen
2008-06-09
kabbesy 写道
Quake Wang 写道
这样做会不会更好一些?
在Config这个class所在的package下面,有一个同名的Config.properties文件,里面有设置同名field的值:
然后实现一个BeanPostProcessor来根据这个约定来注入值。
这样就省了在Config.java文件写一堆的@Properties annotation,如果你觉得在某些情况下properties文件无法保证和field同名这个约定,你也可以再以@Properties annotation为优先设定。
在Config这个class所在的package下面,有一个同名的Config.properties文件,里面有设置同名field的值:
accounts=xxx user=xxx password=xxx
然后实现一个BeanPostProcessor来根据这个约定来注入值。
这样就省了在Config.java文件写一堆的@Properties annotation,如果你觉得在某些情况下properties文件无法保证和field同名这个约定,你也可以再以@Properties annotation为优先设定。
请问有没有在这个设计基础上的成型代码?
等分散到package之后,或许有一天你又会想把它们都集中管理,放入某个xml里边,这个xml名字或许可以叫做package-class-mapping.xml 简称pcm跟hibernate的hbm对应,可以一个文件放一个vo设置,或者根据package放置多个vo设置,总之随你心意:)
27 楼
kabbesy
2008-06-05
Quake Wang 写道
这样做会不会更好一些?
在Config这个class所在的package下面,有一个同名的Config.properties文件,里面有设置同名field的值:
然后实现一个BeanPostProcessor来根据这个约定来注入值。
这样就省了在Config.java文件写一堆的@Properties annotation,如果你觉得在某些情况下properties文件无法保证和field同名这个约定,你也可以再以@Properties annotation为优先设定。
在Config这个class所在的package下面,有一个同名的Config.properties文件,里面有设置同名field的值:
accounts=xxx user=xxx password=xxx
然后实现一个BeanPostProcessor来根据这个约定来注入值。
这样就省了在Config.java文件写一堆的@Properties annotation,如果你觉得在某些情况下properties文件无法保证和field同名这个约定,你也可以再以@Properties annotation为优先设定。
请问有没有在这个设计基础上的成型代码?
26 楼
aws
2008-05-12
还是喜欢集中配置在xml里面
25 楼
罪恶的小手
2008-05-11
没看懂,,
也许我涉足的还不够的缘故吧,,
也许我涉足的还不够的缘故吧,,
24 楼
lsy
2008-05-07
个人感觉还是喜欢在配置文件里面写${},因为这些全局的设置写在XML里面,很容易找到哪些bean用了这些properties,以后维护修改也不涉及修改代码。反过来如果用annotation,那么对于一个刚接触项目的人,如果他没找到Config就茫然了。(Config配置VO应该很好找,这里只是举个例子 )
23 楼
风雪涟漪
2008-05-04
看来约定成俗是未来的大方向了。。。。楼主的方案很好,学习了。
22 楼
andyao
2008-05-04
使用这种方法要注意bean的一些callback methods
下面两种情况使用不到@Properties注入的值
将代码中的postProcessBeforeInitialization和postProcessAfterInitialization互换,在初始化之前注入@Properties注释的filed,可以解决使用InitializingBean的afterPropertiesSet获取不到值得情况。
下面两种情况使用不到@Properties注入的值
- JSR-250的@PostConstruct
- InitializingBean的afterPropertiesSet
将代码中的postProcessBeforeInitialization和postProcessAfterInitialization互换,在初始化之前注入@Properties注释的filed,可以解决使用InitializingBean的afterPropertiesSet获取不到值得情况。
21 楼
iExploiter
2008-04-28
在下一个项目中就尝试尝试这种做法看看。
20 楼
linhao
2008-04-12
难道,这是个系列贴?
19 楼
xyz20003
2008-04-12
Quake Wang所说的意思是
如果有一个com.family168.domain.Student类。
那么他对应的i18n文件就放在com/family168/domain/Student.properties下。
听ajoo说guice是静态绑定模型,可能没办法实现这种动态查找同一个包下对应配置的功能。
如果有一个com.family168.domain.Student类。
那么他对应的i18n文件就放在com/family168/domain/Student.properties下。
听ajoo说guice是静态绑定模型,可能没办法实现这种动态查找同一个包下对应配置的功能。
18 楼
yizhuo
2008-04-12
xyz20003 写道
不知道有没有可能修改成Quake Wang说的那种自动查找包内同名配置文件的方式。
是说不同包内有同样的设置文件,但是里面的内容不同?
目前我的开发里没有这种需求。如果是开发和生产环境要用不同的代码,可以把不同的文件放进classpath,然后读取classpath里面的文件。
比如test/config/server.properties和main/config/properties,测试环境用前者,生产环境用后者
17 楼
yizhuo
2008-04-12
ahuaxuan 写道
上面的设置代码在spring只是一段配置?
你指的是setProperty么?我只是写个testcase举例,真正的环境自然是读取property文件。
区别在于,spring要做你写的那些东西,而guice不需要。
16 楼
xyz20003
2008-04-12
说简化也就是没有xml了而已,也许感觉xml换成了annotation就算是简化了,是说配置文件减少了吗?
用guice支持properties还是第一次见到,谢谢yizhuo的代码了。不知道有没有可能修改成Quake Wang说的那种自动查找包内同名配置文件的方式。
用guice支持properties还是第一次见到,谢谢yizhuo的代码了。不知道有没有可能修改成Quake Wang说的那种自动查找包内同名配置文件的方式。
发表评论
-
过滤字符的性能调优?挤一挤还是有的
2010-05-29 05:54 3545/* *auth ... -
Master-Slave,Spring,Hibernate,故事曲折离奇,情结跌宕起伏
2009-02-05 13:49 8586/** *作者:张荣华 *日期 ... -
弃成见,反省,并重新认识struts.i18n.encoding
2008-12-24 15:42 3786[size=medium]之前和大家讨论了struts2.0中 ... -
关键字:查询,事务,粒度
2008-08-22 17:05 5042[size=medium]/** *作者: ... -
看看mina和memcached的联姻(适合不同语言客户端,高并发?)
2008-07-21 17:06 7892[size=medium]/** * 作者:张荣华 * 日 ... -
如何解决mysql的master-slave模式中ReplicationDriver的使用问题
2008-06-19 18:23 8172/** * 作者:张荣华 * 日期:2008-6-19 ... -
用jamon来监控你的sql执行效率
2008-02-25 15:48 3666/** *作者:张荣华 *日期:2008-2-25 ... -
java同msn的通信,大家想想用途吧
2007-11-24 17:14 2485程序员的生活真是单调,除了编程还是编程,工作日 ... -
EAI企业应用集成场景及解决方案
2007-09-21 18:21 3120/** *作者:张荣华(ahuaxuan) *2007-9 ... -
quartz和应用的集群问题
2007-08-21 18:36 12736之前看到很多关于quartz的讨论,尤其是关于quar ... -
优化程序之前,可用Jamon来监测你的Spring应用
2007-08-14 18:14 8013/** *作者:张荣华(ahuaxuan) *2007-8-1 ... -
请问责任链真的是一种设计模式吗
2007-07-26 18:12 9315坛子上讨论设计模式的也挺多的,但是关于这个责任链模式还没有人提 ... -
把ActiveMQ的控制台整合到你的web程序中
2007-07-19 12:06 8727在使用ActiveMQ的时候把ActiveMQ的控制台整 ... -
设计模式之:解剖观察者模式
2007-07-17 16:12 6815[size=9] 论坛上很多人都 ... -
java邮件:在简单和复杂之间的方案
2007-07-11 18:07 7557/** *作者:张荣华(ahuaxu ... -
强强连手, 在模板中分页,看Freemarker和displaytag的结合
2007-07-09 09:22 6885/** *作者:张荣华(ahuaxuan) *2007-0 ... -
解惑:在spring+hibernate中,只读事务是如何被优化的。
2007-06-28 18:22 7577/** *作者:张荣华(ahuaxuan) *2007- ... -
让webwork零配置 第二章(实现)(实例已放出,大家可以下载运行)
2007-06-25 09:23 5675/** *作者:张荣华(ahuaxuan) *2007-0 ... -
让webwork2零配置,第一章(主贴再次更新)
2007-06-18 15:41 13239/** *作者:张荣华(ahuaxuan) *2007-0 ... -
Spring声明式事务管理源码解读之事务提交
2007-06-11 09:19 7255/** *作者:张荣华(ahuaxuan) *2007-0 ...
相关推荐
赠送jar包:spring-plugin-core-2.0.0.RELEASE.jar; 赠送原API文档:spring-plugin-core-2.0.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-core-2.0.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring...
赠送jar包:spring-plugin-metadata-2.0.0.RELEASE.jar; 赠送原API文档:spring-plugin-metadata-2.0.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-metadata-2.0.0.RELEASE-sources.jar; 赠送Maven依赖信息...
赠送jar包:spring-plugin-metadata-1.2.0.RELEASE.jar; 赠送原API文档:spring-plugin-metadata-1.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-metadata-1.2.0.RELEASE-sources.jar; 包含翻译后的...
赠送jar包:spring-plugin-core-1.2.0.RELEASE.jar; 赠送原API文档:spring-plugin-core-1.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-core-1.2.0.RELEASE-sources.jar; 包含翻译后的API文档:...
赠送jar包:spring-plugin-metadata-2.0.0.RELEASE.jar; 赠送原API文档:spring-plugin-metadata-2.0.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-metadata-2.0.0.RELEASE-sources.jar; 赠送Maven依赖信息...
赠送jar包:spring-plugin-core-2.0.0.RELEASE.jar; 赠送原API文档:spring-plugin-core-2.0.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-core-2.0.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring...
赠送jar包:spring-plugin-metadata-1.2.0.RELEASE.jar; 赠送原API文档:spring-plugin-metadata-1.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-metadata-1.2.0.RELEASE-sources.jar; 包含翻译后的...
赠送jar包:spring-plugin-core-1.2.0.RELEASE.jar; 赠送原API文档:spring-plugin-core-1.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-plugin-core-1.2.0.RELEASE-sources.jar; 包含翻译后的API文档:...
struts2-spring-plugin-2.3.31.jar
最新struts2-spring-plugin-2.3.24.1.jar
struts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jarstruts2-spring-plugin-2.3.15.2.jar ; struts2-json-plugin-2.3.16.3.jar
JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-2.0.11JavaEE源代码 struts2-spring-plugin-...
struts2-spring-plugin-2.2.1.jarstruts2-spring-plugin-2.2.1.jarstruts2-spring-plugin-2.2.1.jar
struts2-spring-plugin-2.0.6.jar
java jar包,亲测试可用 ...把一个JAR文件添加到系统的classpath环境变量之后,java通常会把这个JAR文件当做一个路径来处理。通常使用jar命令来压缩,可以把一个或多个路径全部压缩成一个JAR文件。
spring4整合struts2所需要的jar包,缺少这个jar包则会报错
struts2-spring-plugin-2.3.15.3.jar struts整合Spring的插件Jar包。
导入struts2-spring-plugin包,在web.xml中设置spring的监听器, spring监听器对应的API类为:org.springframework.web.context.ContextLoaderListener。 struts2-spring-plugin包为我们将struts2的对象工厂设置为...
java运行依赖jar包
struts2+spring整合插件 struts2-spring-plugin-2.0.12.jar