2012-02-28 13 views
0

iamが動的引数値、つまりspring ioc.But iamを使用したリクエストからのusernameを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> 

UserServiceの

enter image description here

enter image description here

+0

さて、usernameプロパティをuserdaに設定するのではなく、単に 'にしています。 – pap

+0

イメージの代わりにテキストを使うのがいいです。xmlをコピーして答えを書くことができるようになりました。今すぐ手書きで書く必要があります。 – Ralph

答えて

0

XMLでは、周囲のBeanにのみプロパティを割り当てることができます。

ので

動作しません

、UserServiceのは提出 usernameとを持っていない、そのためのバネが起動しないはずだから。

次の2つの方法でそれを書くことができます。

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

しかし、あなたは1つのプロパティの両方のスタイルを混在させることはできません。


私はuserdaoし、その値を転送することができます実際に私の要件は、ユーザー名の値がUserService.Thisユーザー名で他のビジネス・ロジックに基づいて取得されたコメント

がuserdao constructor.Howに転送されますフォーム。

これは不可能であり、少なくとも手書きの魔法の多くはありません。理由は簡単です:XMLファイルで記述されたオブジェクトは、アプリケーションの起動時に作成され、開始時に値が設定されます。

しかし、一般的に私はあなたがいくつかのスコープ付きの豆であなたの目標を達成することができると思います。しかし、スコープ付きBeanをデータベース接続に使用できるかどうかは疑いがありません。

新しい質問帽子に、この回答のコメントで説明した説明と一緒に動的要件に焦点を当てることを強くお勧めします。 (しかしbugy XMLの例なし))

@see Spring Reference Chapter 3.5 Bean scopes

+0

ありがとうございます。私はUserServiceからuserdaoにダイナミックとしてユーザー名の値を渡したいと思います。 – user1127214

+0

ダイナミックなことはどういう意味ですか? – Ralph

+0

実際に私のrequriemntはUserServiceの他のbusineesロジックに基づいて取得しています。このユーザー名はuserdao contrutorに転送されます。私はその値をuserdao.plzに転送することができます – user1127214

0

あなたがUserDaoImplのプロパティは、それが長いスレッドセーフでないusernameを行った場合、すなわち2つのコールがで来る場合に何が起こりますか同時? 2回目の呼び出しは、初めてgetUserListSize()が呼び出される前に、usernameプロパティの設定を上書きします。 1回の呼び出しごとに新しい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); 
} 

最も簡単な方法は、メソッドのパラメータを使用することです

関連する問題