2012-02-28 22 views
0

Iam嘗試傳遞動態參數值,即使用spring的請求中的用戶名ioc.But iam無法在userdaoimp中看到用戶名值。在Springs中使用setter注入傳遞動態參數

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> 

UserService

enter image description here

enter image description here

+0

那麼,你沒有設置用戶名屬性爲userdao的任何東西,只是''。 – pap 2012-02-28 14:01:38

+0

這將是很好的使用文字,而不是圖像,所以人們可以複製XML的東西來寫答案,現在我必須手寫全部。 – Ralph 2012-02-28 16:39:30

回答

0

在XML中,您可以僅將屬性分配給周圍的bean。

所以

將無法​​正常工作,因爲UserService沒有提起username及其所用的彈簧不應該開始。

您可以用兩種不同的方式把它寫:

<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> 

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

但是你不能爲一個屬性混合兩種風格。


表格註釋

其實我的要求是Username值是越來越基於在UserService.This名其他業務邏輯將被轉發到的UserDAO constructor.How我可以轉發值的UserDAO 。

這是不可能的,或者至少不是沒有大量的手寫魔法。原因很簡單:在應用程序啓動時創建XML文件中描述的對象,並在啓動時設置值。

但總的來說,我認爲你可以用一些scoped bean來實現你的目標。但是我非常懷疑scoped bean可以用於數據庫連接。

我強烈建議問一個新的問題集中在動態要求上,並附上你在這個答案的評論中給出的解釋。 (但沒有bugy XML例子))

@see Spring Reference Chapter 3.5 Bean scopes

+0

Thanks.But我想要從UserService將用戶名值作爲動態傳遞到userdao。 – user1127214 2012-02-29 03:48:23

+0

你是什麼意思動態? – Ralph 2012-02-29 06:12:01

+0

其實我的requriemnt是用戶名值是根據其他業務邏輯UserService.This用戶名將被轉發到userdao contrutor.How我可以轉發該值userdao.plz幫助我 – user1127214 2012-02-29 07:41:59

0

如果您usernameUserDaoImpl的屬性,然後它不再是線程安全的,也就是說,如果兩個電話在進來會發生什麼同時?第二次調用將在第一次調用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; 
} 

而且在UserService

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