项目是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.*