- 主题:struts2的<s:bean/>问题
项目是struts2 + spring. 一般的用于action中的bean,
都使用spring的自动注入, 其好处是可以确保不需要保留
状态的bean都是单例的, 不会生成大量实例浪费空间.
现在, 有个需求是, 项目中经常遇到一些下拉框,或者combobox
之类的让用户选择的控件, 其内容来自数据库的某些表. 我
现在的做法是使用<s:bean/>, 这些bean所需要的数据服务, 都
通过一个单例的手工实现的SpringContextUtil来获取. 这个
SpringContextUtil实现了ApplicationContextAware接口, 可以
获得ApplicationContext, 从而可以根据bean的id获取需要的
bean, 相当于干了Spring框架的活.(这也是被逼的,因为<s:bean/>
创建的bean似乎不受Spring框架的控制, 所以没有注入能力)
比如, 列出库中的国家的bean:
class CountryBean()
{
public List<Country> listCountries() {
return (CountryService)SpringContextUtil.getBean("countryService").listCountries();
}
}
在jsp页面中我就这么用:
<s:bean name="org.ironcool.CountryBean" var="c"/>
<s:select name="countryId" list="#c.listCountries()" listKey="countryId" listValue="countryName"/>
现在我的问题是, 我能确保SpringContextUtil和相关的CountryService是单例, 但是却无法保证CountryBean是单例的. 如果每次<s:bean/>都生成新的实例, 这种方法的效率就值得
怀疑了, 因为调用是很频繁的.
有没有哪位知道<s:bean/>生成的bean的情况? 是默认单例还是每次生成新的呢?
-------
写的比较长, 是为了说清前因后果, 谢谢大家了.
--
FROM 123.112.62.*
不用bean标签 直接将这个select的list对应到action 的某个属性 可以不?
【 在 ironcool (情绪稳定的不明真相的围观群众) 的大作中提到: 】
: 项目是struts2 + spring. 一般的用于action中的bean,
: 都使用spring的自动注入, 其好处是可以确保不需要保留
: 状态的bean都是单例的, 不会生成大量实例浪费空间.
: ...................
--
FROM 125.33.172.*
当然可以, 可是这种select出现的如此频繁, 如果有20个action, 那你就需要
在每个action做这件事, 那也太冗余了
【 在 seaver31 (benny) 的大作中提到: 】
: 不用bean标签 直接将这个select的list对应到action 的某个属性 可以不?
--
FROM 125.33.130.*
内存里面缓存一下呢
【 在 ironcool (情绪稳定的不明真相的围观群众) 的大作中提到: 】
: 当然可以, 可是这种select出现的如此频繁, 如果有20个action, 那你就需要
: 在每个action做这件事, 那也太冗余了
--
FROM 125.33.172.*
怎么讲?
是不是将数据库数据放在某个单例的类中, 然后在各个
action中去取?
可是第一, 还是要在action中做相关的操作. 第二, 如
果需要这些数据保持最新的, 那么每次更新相关的表的
同时还需要更新内存中的数据.
而<s:bean/>的方式, 写一次, 到处都可以通过标签使
用. action根本不用关心这个问题.
【 在 seaver31 (benny) 的大作中提到: 】
: 内存里面缓存一下呢
--
FROM 123.112.62.*
某个静态变量来缓存
达不到你下面说的要求
【 在 ironcool (情绪稳定的不明真相的围观群众) 的大作中提到: 】
: 怎么讲?
: 是不是将数据库数据放在某个单例的类中, 然后在各个
: action中去取?
: ...................
--
FROM 125.33.172.*