首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有静态setter函数的java

问带有静态setter函数的java
EN

Stack Overflow用户
提问于 2011-06-22 09:19:35
回答 4查看 4.9K关注 0票数 2

我有一个在tomcat 6上执行的web应用程序。

我有一个MysqlDb类,它使用来自spring的BasicDataSource。

到目前为止,我已经在web.xml中使用了以下bean配置

代码语言:javascript
复制
<bean id="MysqlDb" class="com.xpogames.gamesisland.mysql.MysqlDb">
    <property name="idDataSource" ref="idDataSource"/>
 </bean>

我有以下设置函数:

代码语言:javascript
复制
  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?

代码语言:javascript
复制
ServletContext servletContext = this.getServletContext();
this._context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);

然后从那里取下豆子,然后删除我在web.xml中打印的行?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-06-22 10:29:46

据我所知,我有一个不好的实现想法。我仍然需要一个构造函数,所以构建一个带有静态函数和静态init的类是个坏主意,尝试从bean执行静态setter是不符合逻辑的,也是不可能的。

相反,我将类更改为单例类,这样我就可以在我的应用程序中的任何地方使用它,并且它将只被构造一次。

谢谢你提供的所有信息。

更新

我仍然不知道这是不是一个好方法,但至少它是有效的。

在我的red-web.xml (将其视为spring applicationContext.xml)中,我有以下内容:

代码语言:javascript
复制
 <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 ()函数,以便正确设置数据源。

代码语言:javascript
复制
<bean id="web.handler" class="com.xpogames.gamesisland.Application">
    <property name="MysqlDb" ref="MysqlDb"/>
</bean>

在这里,我创建了我的应用程序的主bean,并确保了要根据bean配置设置MysqlDb类的函数MysqlDb。

到目前为止,mysqlDb充当一个单子类,因为它的构造函数受到保护,并且它只创建实例一次:

代码语言:javascript
复制
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函数:

代码语言:javascript
复制
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);
}

所以这个配置可以工作。这显然不是推荐的或最好的解决方案!但是,在我想出一个更好的解决方案之前,我似乎需要进一步阅读和学习。

票数 0
EN

Stack Overflow用户

发布于 2011-06-22 09:22:18

首先,您已经声明了setter setidDataSource。应该是setIdDataSource。属性的第一个字母必须是单词set之后的大写字母。

另外,setter方法不能是静态的,而必须是实例方法。

票数 3
EN

Stack Overflow用户

发布于 2011-06-22 10:48:31

Spring在默认情况下是单例,只要从上下文中使用bean,就不需要将类实现为单例。对于您的问题,最简单的答案是在上下文中设置数据源之后从上下文中获取bean,但我认为您希望远离上下文。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6437605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档