3 回答

TA貢獻1798條經(jīng)驗 獲得超7個贊
這其實是一個Spring容器BeanFactory
的問題,具體可以參考Spring參考7.8.3章節(jié)中的這一段,
When you need to ask a container for an actual FactoryBean instance itself instead of the bean it produces, preface the bean’s id with the ampersand symbol ( &) when calling the getBean() method of the ApplicationContext. So for a given FactoryBean with an id of myBean, invoking getBean("myBean") on the container returns the product of the FactoryBean; whereas, invoking getBean("&myBean") returns the FactoryBean instance itself.
大致意思翻譯過來就是,當你用beanName去引用一個實現(xiàn)了FactoryBean
的工廠實例,其實引用的并不是工廠本身,而是工廠中產(chǎn)生的產(chǎn)品(FactoryBean#getObject()
)。但是當你真正想要的是工廠而不是產(chǎn)品時,可以在beanName前加上&
。
也就是,在你的代碼中,需要加原先的ref="sqlSessionFactory"
改為ref="&sqlSessionFactory"
就能獲取到類型為SqlSessionFactoryBean
而不是SqlSessionFactory
的對象了。
題外話,就你的DAO設計來看,依賴一個專為Spring使用的對象并不是一個很好的設計。應該依賴于MyBatis直接提供的SqlSessionFactory
實例。

TA貢獻1784條經(jīng)驗 獲得超2個贊
看文檔:
問題在于,SqlSessionFactoryBean
是個工廠,容器通過這個工廠的getObject()
方法得到了真正要注入的Bean
。我猜你應該是在messageLogDao
之類要使用sqlSessionFactory
的地方,給注入的內(nèi)容寫死了類型SqlSessionFactoryBean
吧?
但按照我們剛才說的,實際的類型并不是SqlSessionFactoryBean
,應該是DefaultSqlSessionFactory
才對
這個你得多看文檔。我也沒測試,不敢保證結果^^

TA貢獻1804條經(jīng)驗 獲得超7個贊
SqlSessionFactory是一個接口,DefaultSqlSessionFactory是一個類實現(xiàn)了SqlSessionFactory接口。
我們知道sqlsession對應著一次數(shù)據(jù)庫會話。由于數(shù)據(jù)庫會話不是永久的,因此sqlsession的生命周期也不應該是永久的.相反,在你每次訪問數(shù)據(jù)庫時都需要創(chuàng)建它(當然并不是說在Sqlsession里只能執(zhí)行一次sql,你可以執(zhí)行多次,當一旦關閉了Sqlsession就需要重新創(chuàng)建它)。創(chuàng)建Sqlsession通過SqlsessionFactory來創(chuàng)建。由于SqlSessionFactory在mybatis的默認實現(xiàn)類為DefaultSqlSessionFactory , 其構造過程主要是通過調(diào)用build方法來創(chuàng)建,build方法通過讀取字節(jié)流InputStream或者字符流Reader,當然字節(jié)流和字符流都是通過讀取配置文件xml獲取得到的。
添加回答
舉報