2010-09-27 44 views
6

我想使用@Repository spring註釋來避免在context.xml中添加bean。 我使用iBATIS的整合,所以我的倉庫類看起來像這樣在超類中注入@Repository bean的派生屬性沒有@Autowired

@Repository("userDao") 
public class UserDaoMybatis extends SqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

SqlMapClientDaoSupport(春季庫類)的設置所需的屬性最終方法未與@Autowired註解或@Resourse

public final void setSqlMapClient(SqlMapClient sqlMapClient) { 
    if (!this.externalTemplate) { 
     this.sqlMapClientTemplate.setSqlMapClient(sqlMapClient); 
    } 
} 

SqlMapClient bean在spring context.xml中定義。 如果userDAO的bean是在XML定義它工作正常,但是當我把@Repository註解和刪除bean聲明,我得到以下異常

java.lang.IllegalArgumentException: Property 'sqlMapClient' is required 

一種解決方法可以是添加新的方法一樣

@Aitowired 
injectSqlMapClient(SqlMapClient sqlMapClient) { 
    setSqlMapClient(sqlMapClient); 
} 

但它看起來很難看

有沒有其他方式喲注入屬性沒有定義?

+1

我認爲你的解決方法是一個相當不錯的解決方案。 – Bozho 2010-09-27 20:53:38

回答

3

如何引入中介超類?

public class AutowiringSqlMapClientDaoSupport extends SqlMapClientDaoSupport { 

    @Autowired 
    injectSqlMapClient(SqlMapClient sqlMapClient) { 
     setSqlMapClient(sqlMapClient); 
    } 
} 

然後

@Repository("userDao") 
public class UserDaoMybatis extends AutoringSqlMapClientDaoSupport implements UserDao { 
    // ... 
} 

是的,它繼承的濫用,但不超過現有SqlMapClientDaoSupport更糟的是,如果你是不顧一切地避免在DAO類本身注射鉤,我可以沒有想到更好的方法。

+0

我也想過有這樣一個類(我有不止一個DAO,所以它絕對比每個DAO都有這個injectSqlMapClient更好),但它對我來說看起來很難看,因爲我需要引入新的類,我真的不需要 - 我刪除了一件事(bean定義),但取而代之(新類)。但無論如何,謝謝你的想法 – 2010-10-01 15:21:44