2012-12-17 120 views
0

我想創建一個泛型類,它將幫助我減少樣板代碼。我正在使用Spring 3(MVC)和Hibernate 4。如何實例化泛型spring bean?

類看起來是這樣的:

@Repository("AutoComplete") 
public class AutoComplete<T extends Serializable> implements IAutoComplete { 

    @Autowired 
    private SessionFactory sessionFactory; 

    private Class<T> entity; 

    public AutoComplete(Class<T> entity) { 
     this.setEntity(entity); 
    } 

    @Transactional(readOnly=true) 
    public List<String> getAllFTS(String searchTerm) { 
     Session session = sessionFactory.getCurrentSession(); 
     return null; 
    } 

    public Class<T> getEntity() { 
     return entity; 
    } 

    public void setEntity(Class<T> entity) { 
     this.entity = entity; 
    } 

} 

我實例化的bean是這樣的:

IAutoComplete place = new AutoComplete<Place>(Place.class); 
place.getAllFTS("something"); 

如果我運行代碼,我得到 「沒有發現默認的構造函數」 的異常。

Session session = sessionFactory.getCurrentSession(); 

這是爲什麼,我該如何解決這個問題:如果我添加一個默認的構造函數,我在這行獲得空指針異常?我猜這個問題是因爲bean沒有被Spring本身實例化,所以它不能自動裝載字段。我想自己實例化bean,但如果可能的話,仍然會對它進行spring管理。

+0

你看過SpringData嗎?您不必爲存儲庫編寫像這樣的泛型類。 –

回答

0

Spring容器會爲你實例化這個bean,在這種情況下,sessionFactory會被注入。你用你自己的代碼實例化這個bean:new AutoComplete(),當然sessionFactory是null。

0

永遠不要實例化具有@Autowired註釋的字段的類。如果你這樣做的話,將會導致null。你應該做的是你應該得到Spring的ApplicationContext的引用(你可以通過實現ApplicationContextAware接口來實現),並在你的AutoComplete類的默認構造函數中使用下面的代碼。

public AutoComplete() { 
    sessionFactory = (SessionFactory) applicationContext.getBean("sessionFactory"); 
} 

使用Spring的主要做法之一是消除對象的瞬間。我們應該在Spring配置中指定所有東西,以便Spring在我們需要時爲我們實例化對象。但在您使用通用方法的情況下,您需要。

+0

我實現了ApplicationContextAware接口,但我在默認的構造函數中得到了NullPointer異常。 –

+0

請提供你的修改代碼。 – shazin

+0

這裏是:http://pastebin.com/3wh5vAtk –

1

確保您已在您的xml bean定義文件中添加了<context:component-scan base-package='package name'>

由於@Repository是構造型,Spring容器將執行類路徑掃描,添加它的bean定義並注入它的依賴關係。

稍後,您可以使用Bean名稱(AutoComplete)從ApplicationContext獲取bean的句柄。