我有一个在tomcat 6上执行的web应用程序。
我有一个MysqlDb类,它使用来自spring的BasicDataSource。
到目前为止,我已经在web.xml中使用了以下bean配置
<bean id="MysqlDb" class="com.xpogames.gamesisland.mysql.MysqlDb">
<property name="idDataSource" ref="idDataSource"/>
</bean>我有以下设置函数:
public void setidDataSource(BasicDataSource ds) {
this._dataSource=(DataSource)ds;
this._simpleJdbcTemplate = new SimpleJdbcTemplate(_dataSource);
this._jdbcTemplate = new JdbcTemplate(_dataSource);
}我希望将类转换为使用静态函数,因此我创建了一个空的私有构造函数,这样类就不会被调用者显式实例化。
此外,我将setidDataSource函数更改为静态函数,但当我尝试这样做时,我会得到以下错误:
设置属性值时出现
错误;嵌套异常是bean类com.xpogames.gamesisland.mysql.MysqlDb的无效属性“idDataSource”:Bean属性“idDataSource”不可写或具有无效的setter方法。setter的参数类型是否与getter的返回类型匹配?
在web.xml中有解决此问题的方法吗?还是需要手动获取ServletContext?
ServletContext servletContext = this.getServletContext();
this._context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);然后从那里取下豆子,然后删除我在web.xml中打印的行?
发布于 2011-06-22 10:29:46
据我所知,我有一个不好的实现想法。我仍然需要一个构造函数,所以构建一个带有静态函数和静态init的类是个坏主意,尝试从bean执行静态setter是不符合逻辑的,也是不可能的。
相反,我将类更改为单例类,这样我就可以在我的应用程序中的任何地方使用它,并且它将只被构造一次。
谢谢你提供的所有信息。
更新
我仍然不知道这是不是一个好方法,但至少它是有效的。
在我的red-web.xml (将其视为spring applicationContext.xml)中,我有以下内容:
<bean id="MysqlDb" class="com.xpogames.gamesisland.mysql.MysqlDb" init-method="getInstance">
<property name="idDataSource" ref="idDataSource"/>
</bean>在这里,它创建一个MysqlDb bean并将其配置为使用getInstance() init方法if MysqlDb类。我确保在setidDataSource类中有一个mysqlDb ()函数,以便正确设置数据源。
<bean id="web.handler" class="com.xpogames.gamesisland.Application">
<property name="MysqlDb" ref="MysqlDb"/>
</bean>在这里,我创建了我的应用程序的主bean,并确保了要根据bean配置设置MysqlDb类的函数MysqlDb。
到目前为止,mysqlDb充当一个单子类,因为它的构造函数受到保护,并且它只创建实例一次:
public static MysqlDb getInstance() {
if (instance == null) {
instance = new MysqlDb();
}
return instance;
}我遇到的问题是,在我的应用程序的其他部分中,每当我使用getInstance()时,就会出现MysqlDb类以及使用setidDataSource where null设置的所有变量。
因此,解决这个问题,我在mysqlDb中创建了另一个名为mysqlDb的函数:
公共静态空setInstance(MysqlDb db) { instance=db;}
这是我的主要应用程序中的主要setMysqlDb函数:
public void setMysqlDb(MysqlDb db) {
this._mysqlDb=db;
/* it seems that without forcing a setInstance on the class, whenever other classes
* would try to getInstance(), variables that are supposed to be configured by the bean
* would be empty. this resolves that issue
*/
MysqlDb.setInstance(db);
}所以这个配置可以工作。这显然不是推荐的或最好的解决方案!但是,在我想出一个更好的解决方案之前,我似乎需要进一步阅读和学习。
发布于 2011-06-22 09:22:18
首先,您已经声明了setter setidDataSource。应该是setIdDataSource。属性的第一个字母必须是单词set之后的大写字母。
另外,setter方法不能是静态的,而必须是实例方法。
发布于 2011-06-22 10:48:31
Spring在默认情况下是单例,只要从上下文中使用bean,就不需要将类实现为单例。对于您的问题,最简单的答案是在上下文中设置数据源之后从上下文中获取bean,但我认为您希望远离上下文。
https://stackoverflow.com/questions/6437605
复制相似问题