spring依賴注入失效的原因之一
1.用hibernate的動態多資料來源(通過方法引數選擇使用哪個dataSource,然後注入sessionFactory,再注入transactionManager)
2.用mybatis去連線另外一個數據庫
3.用springJDBC
我的功能只要查詢而已,不需要事務,所以我選的是最簡單的方法,就是在配置檔案新建一個sessionFactory(死方法,不是hibernate的動態多資料來源)。
<bean id="sessionFactoryDC" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dcenter"/> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop> <prop key="net.sf.ehcache.configurationResourceName">${net.sf.ehcache.configurationResourceName}</prop> <prop key="hibernate.jdbc.batch_size">0</prop> <!--<prop key="hibernate.use_nationalized_character_data">false</prop>--> <prop key="hibernate.search.default.indexBase">${hibernate.search.default.indexBase}</prop> </props> </property> </bean>
dcenter是遠端的一個數據源,然後我在程式裡用Spring @Resource或者@[email protected]的註解注入
發現注入的還是原來的資料來源。研究一下,發現內部還有個方法,手動取得新的sessionFactory的bean 去呼叫createSQLQuery修改後成了這個樣@Autowired public void setSessionFactory(@Qualifier("<span style="font-family: Arial, Helvetica, sans-serif;">sessionFactoryDC</span><span style="font-family: Arial, Helvetica, sans-serif;">")</span><span style="font-family: Arial, Helvetica, sans-serif;">final SessionFactory sessionFactory) {</span> custDao = new HibernateDao<Map, String>(sessionFactory, Map.class); }
@Autowired public void setSessionFactory(final SessionFactory sessionFactory) { custDao = new HibernateDao<Map, String>(sessionFactory, Map.class) { @Override public SQLQuery createSqlQuery(String sql, Parameter parameter) { SessionFactory sf = (SessionFactory)SpringContextHolder.getBean("sessionFactoryDC"); SQLQuery query = sf.getCurrentSession().createSQLQuery(sql); setParameter(query, parameter); return query; } }; }
1. openSession 從字面上可以看得出來,是開啟一個新的session物件,而且每次使用都是開啟一個新的session,假如連續使用多次,則獲得的session不是同一個物件,並且使用完需要呼叫close方法關閉session。
2. getCurrentSession ,從字面上可以看得出來,是獲取當前上下文一個session物件,當第一次使用此方法時,會自動產生一個session物件,並且連續使用多次時,得到的session都是同一個物件,這就是與openSession的區別之一,簡單而言,getCurrentSession 就是:如果有已經使用的,用舊的,如果沒有,建新的。
我的這個類是通過宣告式事務包含在原來的事務中,我用getCurrentSession取的是事務裡面的sessionfactory,所有一直用的是原來的資料來源。修改了一下:
@Autowired
public void setSessionFactory(final SessionFactory sessionFactory) {
custDao = new HibernateDao<Map, String>(sessionFactory, Map.class) {
@Override
public SQLQuery createSqlQuery(String sql, Parameter parameter) {
SessionFactory sf = (SessionFactory)SpringContextHolder.getBean("sessionFactoryDC");
SQLQuery query = sf.openSession().createSQLQuery(sql);
sf.close();
setParameter(query, parameter);
return query;
}
};
}
使用openSession()後發現得到的是正確的資料來源了。注意:一定要記得關閉session,不然資料庫連線會耗盡。
因為我這個功能不需要事務,所以我用的是簡單的寫死的新建一個sessionFactory,大家需要事務的話可以用動態建立sessionFactory的方法
http://fangang.iteye.com/blog/72486 這個有詳細的說明。
強烈建議如果用hibernate實現多資料來源的話要使用動態資料來源(多一個負責判斷選擇資料來源的bean+可以自己寫一個自定義註解@dataSource)的實現。
相關推薦
spring依賴注入失效的原因之一
最近在做一個數據中心的一個專案,需要查詢多個數據庫,目前專案中有3個解決辦法: 1.用hibernate的動態多資料來源(通過方法引數選擇使用哪個dataSource,然後注入sessionFactory,再注入transactionManager) 2.用mybatis去
spring遇到的註解依賴注入失效的問題
1.ApplicationContext ac = new ClassPathXmlApplicationContext("spring配置檔案的相對路徑");2.ApplicationContext ac = new FileSystemXmlApplicationCont
spring 依賴注入的理解
先看一段程式碼假設你編寫了兩個類,一個是人(Person),一個是手機(Mobile)。 人有時候需要用手機打電話,需要用到手機的dialUp方法。 傳統的寫法是這樣: Java code public class Person{ public boolean makeCall(long nu
Spring依賴注入static靜態變數相關問題
Spring依賴注入static靜態變數相關問題 版權宣告:本文為博主原創文章,轉載請註明出處,謝謝。 https://blog.csdn.net/rongxiang111/article/details/78881371 1.Spring不支援依賴注入static靜態變數
Spring依賴注入(構造引數注入、集合,陣列屬性注入、XML自動注入 ,全註解配置)
依賴注入 構造引數注入 --> 常用的是方案一和方案二 MyBean類 YouBean類 <?xml version="1.0" encodin
Spring 依賴注入(DI)示例
依賴注入 依賴注入是為了解決緊耦合問題而產生的一種技術,緊耦合的程式碼難以測試、難以複用、難以理解,當程式出現bug時,修復bug經常會產生連鎖反應,但是,一定程度的耦合又是必須的,完全沒有耦合的程式碼什麼也做不了。所以一種比較好的方案就是,將依賴關係交給第三方元件來描述。 通過DI,物
淺談Spring依賴注入靜態成員變數
Spring的依賴注入是基於bean物件注入屬性;如果在一個類中定義了一個static修飾的成員變數,那麼這個變數就是屬於類的,無法完成依賴注入 eg: 假設在xml配置檔案已經配置了SolrTemplate物件 @Autowired private stat
spring依賴注入(Depondency Injection)
(1)lookup-method <bean id="engine" class="pojo.Engine"></bean> <bean id="car" abstrac
spring依賴注入: 註解注入
註解注入顧名思義就是通過註解來實現注入, Spring和注入相關的常見註解有Autowired、Resource、Qualifier、Service、Controller、Repository、Component。 [email protected]是自動注入
Spring依賴注入
內容主要來自《Spring實戰》第二章,區別在於自己寫了一個測試類,對於初學者更容易理解依賴注入。 先定義兩個介面: 1. CompactDisc.java package soundsystem
Spring 依賴注入實現原理--java反射和ASM框架
依賴注入是spring的一個特性,從配置層面解決了程式耦合、依賴問題,spring提供了建構函式依賴注入、Setter方法依賴注入、自動裝配依賴注入和@autowired註解依賴注入等多種實現方式。 那麼依賴注入是如何實現的?第一反應就是java反射唄,比如建構
利用Lombok編寫優雅的spring依賴注入程式碼,去掉繁人的@Autowired
大家平時使用spring依賴注入,都是怎麼寫的? @Service public class OrderService { @Autowired private UserService userService; } 是不是很熟悉的感覺?但是呢 如果你用IDEA的
spring 依賴注入
spring實現ioc容器的方法是依賴注入,依賴注入的作用是在使用Spring框架建立物件時動態的將其所依賴的物件(例如屬性值)注入Bean元件中。 spring框架的依賴注入通常有兩種實現方式,一種是使用構造方法注入,另一種是使用屬性的setter方法注入。 使用構造方
Spring 依賴注入(1)訪問器注入
例子: Spring中: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="h
spring依賴注入(二)-java注入,xml注入,混合注入
java注入 @Configuration public class CDPlayerConfig { @Bean public CompactDisc compactDisc(){
spring依賴注入--手動裝配
在java程式碼中使用@Autowired或@Resource註解方式進行裝配 1.Teacher類 2.Student類 或 3.spring-config.xml檔案 <?xml version="1.0" encoding="UTF-8"?>
第三講: 3.2 spring 依賴注入
一,通過屬性注入 1. 在beans.xml中,定義id為 people2 ,class屬性不變的bean,並給bean的屬性賦值。 xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.spr
Spring依賴注入,AOP
依賴注入 構造引數注入 --> 常用的是方案一和方案二 MyBean類 YouBean類 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www
Spring依賴注入相關筆記
1.概述:從Spring2.5開始就可以使用註解來配置依賴注入。而不是採用xml來描述一個bean連線,你可以使用相關類,方法或欄位宣告的註解,將bean配置移動到元件類本身。在XML注入之前進行註解注
DrawerLayout抽屜佈局item點選事件失效原因之一
最近使用抽屜佈局 DrawerLayout出現一個問題如下 程式碼描述 點選事件失效 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:andro