在Springs中使用setter注入传递动态参数
我试图使用spring ioc从请求传递动态参数值,即用户名。但我无法在userdaoimp中看到用户名值 UserDAOImpl.java在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
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);
}