1. 程式人生 > >[java][spring]取得通過配置檔案和註解注入的bean、取得當前資料庫連線、取得ApplicationContext的方法

[java][spring]取得通過配置檔案和註解注入的bean、取得當前資料庫連線、取得ApplicationContext的方法

[spring]取得通過配置檔案和註解注入的bean、取得當前資料庫連線、取得ApplicationContext的方法

1、思路:

應用程式啟動時使用ApplicationContextAware讓Spring容器傳遞自己生成的ApplicationContext給我們, 然後我們把這個ApplicationContext設定成一個類的靜態變數, 這樣我們就隨時都可以在老的程式碼裡得到Application的物件了。

2、編寫工具類:ApplicationContextHelper

/**
 * 版權所有:華信軟體
 * 專案名稱:ACWS框架
 * 建立者: Wangdf
 * 建立日期: 2014-4-2
 * 檔案說明: Spring工具欄
 */
package com.huaxin.framework.core.util;

import org.springframework.beans.BeansException;  
import org.springframework.context.ApplicationContext;  
import org.springframework.context.ApplicationContextAware;  
/** 
 * Spring工具欄
 * @author wangdf
 */  
public class ApplicationContextHelper implements ApplicationContextAware {  
    private static ApplicationContext appCtx;  
    /** 
     * 此方法可以把ApplicationContext物件inject到當前類中作為一個靜態成員變數。 
     * @param applicationContext ApplicationContext 物件. 
     * @throws BeansException 
     * @author wangdf
     */  
    @Override  
    public void setApplicationContext( ApplicationContext applicationContext ) throws BeansException {  
        appCtx = applicationContext;  
    }
    
    /**
     * 獲取ApplicationContext
     * @return
     * @author wangdf
     */
    public static ApplicationContext getApplicationContext(){
    	return appCtx;
    }
    
    /** 
     * 這是一個便利的方法,幫助我們快速得到一個BEAN 
     * @param beanName bean的名字 
     * @return 返回一個bean物件 
     * @author wangdf
     */  
    public static Object getBean( String beanName ) {  
        return appCtx.getBean( beanName );  
    }  
} 

3、在Spring的配置檔案中配置上述類後、應用程式啟動時會使用ApplicationContextAware讓Spring容器傳遞自己生成的ApplicationContext給我們, 然後我們把這個ApplicationContext設定成一個類的靜態變數, 這樣我們就隨時都可以在老的程式碼裡得到Application的物件了。
<bean id="SpringApplicationContext" class="com.huaxin.framework.core.util.ApplicationContextHelper"></bean>

4、獲得bean的方法、獲取資料庫連線的方法、獲取ApplicationContext

4.1、取得通過Spring配置檔案注入的任意Bean(以取得DataSource為例)

	<!-- 配置dbcp資料來源 -->
	<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
		init-method='init'		destroy-method="close">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="minIdle" value="${jdbc.minIdle}" />        <!-- 佇列中的最小等待數 -->
		<property name="maxWait" value="${jdbc.maxWait}" />        <!-- 最長等待時間,單位毫秒 -->
		<property name="maxActive" value="${jdbc.maxActive}" />    <!-- 最大活躍數 -->
		<property name="initialSize" value="${jdbc.initialSize}" /><!-- 	初始大小 -->
	</bean>
		//取得資料來源
		DruidDataSource dataSource = (DruidDataSource)ApplicationContextHelper.getBean("dataSource");
		Connection connection = DataSourceUtils.getConnection(dataSource);

		//取得ApplicationContext
		ApplicationContext ctx = ApplicationContextHelper.getApplicationContext();


4.2、取得通過註解方式注入的Bean(以在取得Service為例)

通過@Service("userTestService")定義bean

@Service("userTestService")
public class UserTestServiceImpl implements UserTestService  {
	@Autowired
	private UserTestDao userDao;

	@Transactional(propagation=Propagation.NOT_SUPPORTED) 
	@Override
	public Map<String, Object> doGetRecordById() {
		return userDao.getRecordById("1");
	}
。。。略。。。
}

通過以下程式碼獲取Bean

	/**
	 * 測試Bean獲取
	 * @throws Exception 
	 */
	@Test
	public void testGetBean() throws Exception{
		//通過註解方式
		UserTestService userTestService = (UserTestService)ApplicationContextHelper.getBean("userTestService");
		System.out.println(userTestService);
		
	}