在Springs中使用setter注入传递动态参数

在Springs中使用setter注入传递动态参数,spring,Spring,我试图使用spring ioc从请求传递动态参数值,即用户名。但我无法在userdaoimp中看到用户名值 UserDAOImpl.java public class UserDAOImpl implements UserDAO { private DataSource dataSource; private JdbcTemplate jdbctemplate; private String username; public void setUsern

我试图使用spring ioc从请求传递动态参数值,即用户名。但我无法在userdaoimp中看到用户名值

UserDAOImpl.java

    public class UserDAOImpl implements UserDAO {
    private DataSource dataSource;
    private JdbcTemplate jdbctemplate;
    private String username;


    public void setUsername(String username) {
        this.username = username;
    }

    public DataSource getDataSource() {
        return dataSource;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
        this.jdbctemplate =new JdbcTemplate (dataSource);
    }




    public int getUserListSize() {
        System.out.println("UserDAOImpl::getUserListSize()"+username);
        int count=this.jdbctemplate.queryForInt("SELECT COUNT(*) FROM USER_INFO");
        return count;
    }

   }
epis.dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 



    <bean id="userdao" class="com.epis.dao.UserDAO">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>
                <property name="username"/>
    </bean>
</beans>

用户服务


在XML中,您只能将属性分配给周围的bean

所以

将不起作用,因为UserService没有存档的
用户名
,因此spring不应启动

您可以用两种不同的方式编写:

<bean id="userdao" class="com.epis.dao.UserDAO">
    <property name="dataSource" ref="dataSource" />
    <property name="username" value="aaa"/>
</bean>

<bean  ... class="...UserService">
    <property name="userdao" ref="userdao" />
<bean>


但不能为一个属性混合两种样式


形成评论

实际上,我的要求是用户名值是基于UserService中的其他业务逻辑获得的。此用户名将被转发到userdao构造函数中。我如何将该值转发到userdao

这是不可能的,或者至少没有大量的手写魔法是不可能的。原因很简单:XML文件中描述的对象是在应用程序启动时创建的,值是在启动时设置的

但总的来说,我认为你可以通过一些范围明确的bean来实现你的目标。但是我非常怀疑作用域bean是否可以用于数据库连接

我强烈建议您提出一个新问题,重点关注动态需求,并给出您在回答评论中给出的解释。(但没有错误的xml示例)


@请参见

如果将
用户名
设置为
UserDaoImpl
的属性,则它不再是线程安全的,即,如果两个调用同时传入,会发生什么情况?第二次调用可能会在第一次调用
getUserListSize()
之前覆盖
username
属性的设置。您必须为每个调用创建一个新的
UserDao
对象,这不是很有效

最简单的方法是为方法使用参数:

所以在
UserDao
中:

public int getUserListSize(String username);
UserDaoImpl
中:

public int getUserListSize(String username) {
    logger.debug("UserDAOImpl::getUserListSize():"+username);
    int count = this.jdbctemplate.queryForInt(
        "SELECT COUNT(*) FROM USER_INFO WHERE USER_NAME = ?", username);
    return count;
}
用户服务中

public int getUserListSize() {
    String username = someBusinessLogicObtainsUsername();
    return this.userDao.getUserListSize(username);
}

好吧,你没有为userdao设置username属性,只是
。最好使用文本而不是图像,这样你就可以复制xml内容来编写答案,现在我必须手工编写。谢谢。但是我想将用户名值作为动态从UserService传递到userdao。实际上,我的要求是用户名值是根据UserService中的其他业务逻辑获得的。此用户名将转发到userdao控制器。我如何将该值转发到userdao。plz帮助me@user1127214字体我有扩展我的回答以讨论该要求
public int getUserListSize() {
    String username = someBusinessLogicObtainsUsername();
    return this.userDao.getUserListSize(username);
}