1. 程式人生 > >spring依賴注入失效的原因之一

spring依賴注入失效的原因之一

最近在做一個數據中心的一個專案,需要查詢多個數據庫,目前專案中有3個解決辦法:

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]的註解注入

	@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);
	}
發現注入的還是原來的資料來源。研究一下,發現內部還有個方法,手動取得新的sessionFactory的bean 去呼叫createSQLQuery修改後成了這個樣
	@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