1. 程式人生 > >Spring如何管理Java普通類(Java類獲取Spring容器的bean)

Spring如何管理Java普通類(Java類獲取Spring容器的bean)

方法一:在初始化時儲存ApplicationContext物件

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
applicationContext.getBean("beanId");

這種方法會初始化Spring容器,重新載入applicationContext.xml檔案,如果配置檔案中有一些執行緒類或者定時任務,會執行兩次。

方法二:不依賴於servlet,不需要注入的方式

WebApplicationContext ac = ContextLoader.getCurrentWebApplicationContext
(); TestService testService= (TestService) wac.getBean("testService");

這種方法得等到伺服器啟動完成且Spring容器初始化結束之後才能使用。

方法三:繼承自抽象類ApplicationObjectSupport

抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。
Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 物件注入

方法四:繼承自抽象WebApplicationObjectSupport

類似上面方法,呼叫getWebApplicationContext()獲取WebApplicationContext

方法五:實現介面ApplicationContextAware

實現該介面的setApplicationContext(ApplicationContext context)方法,並儲存ApplicationContext 物件。
Spring初始化時,會通過該方法將ApplicationContext物件注入。

後三種方法都是相似的,都是在普通的類中繼承或實現相應的類或介面來獲取spring 的ApplicationContext物件,但是在使用是一定要注意實現了這些類或介面的普通java類一定要在Spring 的配置檔案application-context.xml檔案中進行配置。否則獲取的ApplicationContext物件將為null。
如下是實現了ApplicationContextAware介面的示例

import org.springframework.context.ApplicationContext;  
import org.springframework.context.ApplicationContextAware;  
/** 
 * 以靜態變數儲存Spring ApplicationContext, 可在任何程式碼任何地方任何時候中取出ApplicaitonContext. 
 *  
 */  
public class SpringContextHolder implements ApplicationContextAware {  
private static ApplicationContext applicationContext;  

/** 
* 實現ApplicationContextAware介面的context注入函式, 將其存入靜態變數. 
*/  
public void setApplicationContext(ApplicationContext applicationContext) {  
SpringContextHolder.applicationContext = applicationContext; // NOSONAR  
}  

/** 
* 取得儲存在靜態變數中的ApplicationContext. 
*/  
public static ApplicationContext getApplicationContext() {  
checkApplicationContext();  
return applicationContext;  
}  

/** 
* 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值物件的型別. 
*/  
@SuppressWarnings("unchecked")  
public static <T> T getBean(String name) {  
checkApplicationContext();  
return (T) applicationContext.getBean(name);  
}  

/** 
* 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值物件的型別. 
*/  
@SuppressWarnings("unchecked")  
public static <T> T getBean(Class<T> clazz) {  
checkApplicationContext();  
return (T) applicationContext.getBeansOfType(clazz);  
}  

/** 
* 清除applicationContext靜態變數. 
*/  
public static void cleanApplicationContext() {  
applicationContext = null;  
}  

private static void checkApplicationContext() {  
if (applicationContext == null) {  
throw new IllegalStateException("applicaitonContext未注入,請在applicationContext.xml中定義SpringContextHolder");  
}  
}  
}

在spring配置檔案中加入

<bean class="com.xxxxx.SpringContextHolder" lazy-init="false"/>  

相關推薦

Spring如何管理Java普通Java獲取Spring容器bean

方法一:在初始化時儲存ApplicationContext物件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.x

Java——String常用

get build pan spa 長度 endwith 同步 兩個 charat 一、String類——描述字符串 常用的方法簡單介紹: 1.charAt()    獲取對應位置的字符 2.length()    獲取字符串的長度 3.concat()    在字符串的尾

Java基礎知識JAVA中String、StringBuffer、StringBuilder的區別

pen 順序 ava tps 進行 exp ringbuf https 對他 java中String、StringBuffer、StringBuilder是編程中經常使用的字符串類,他們之間的區別也是經常在面試中會問到的問題。現在總結一下,看看他們的不同與相同。

Java基礎知識JAVA基本數據型包裝

number 相互 string 內部實現 出現 十六進制 本質 amp 系統 基本數據類型的包裝類 為什麽需要包裝類? Java並不是純面向對象的語言。Java語言是一個面向對象的語言,但是Java的基本數據類型卻不是面向對象的。但是我們在實際使用中

Java 013 StringBuffer、Arrays常見排序、包裝Integer

知識點梳理 心得體會 小知識點 1.執行緒安全與不安全 概念:程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。執行緒安全的程式,多程序需要訪

java基礎複習抽象和介面

介面中的資料域只能是public static final,方法只能是public abstract 由於這個原因,這些修飾也可以忽略。 資料域只能是static final的原因: stackoverflow上: An interface can’t ha

java自定義排程定時器工具java電商訂單自動失效或收貨

java電商訂單超時改狀態工具類 最近在做一個電商專案,要求在使用者下單後未付款30分鐘後就將訂單的狀態改為失效,最初想的是用定時器沒幾秒去資料庫檢視有哪些訂單未付款但超過30分的,就修改狀態,這個方式有兩種缺點,一:如果時間設定的較短,就會導致一直在讀寫資料庫,二:如果時間設定較長就會

檔案上傳下載工具java

import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.InputStream

JAVA程式設計基礎——抽象、密封和介面

一、抽象類 (一)抽象類:包含抽象方法的類稱為抽象類。 抽象類也要被abstract修飾,抽象類中可以有非抽象方法,抽象類不能建立例項物件。 abstract class Animal { public abstract void bark();//抽象方法 pub

GregoranCalandarjava核心P103

package com.cx.test; import java.text.DateFormatSymbols; import java.util.Calendar; import java.util.GregorianCalendar; public class CalendarTest {

Triangle2DJava

定義Triangle2D類,包含: 三個名為p1、p2和p3的MyPoint型資料域,這三個資料域都帶有get和set方法。MyPoint在練習題10.4中定義。 一個無參構造方法,該方法建立三個座標為(0,0)、(1,1)和(2,5)的三個點組成的預設三角形。 一個建

Java程式設計師從笨鳥到菜鳥之java開發常用包裝,數字處理集合等

                一:首談java中的包裝類     Java為基本型別提供包裝類,這使得任何接受物件的操作也可以用來操作基本型別,直接將簡單型別的變量表示為一個類,在執行變數型別的相互轉換時,我們會大量使用這些包裝類。java是一種面嚮物件語言,java中的類把方法與資料連線在一起,並構成了自

Java程式設計師從笨鳥到菜鳥之java開發常用包裝,數字處理集合等

                寫在前面:由於前天專案老師建設局的專案快到驗收階段,所以,前天晚上通宵,昨天睡了大半天,下午我們宿舍聚會,所以時間有點耽誤,希望大家見諒上接:3.Set接 口也是Collection的一種擴充套件,而與List不同的時,在Set中的物件元素不能重複,也就是說你不能把同樣的東西兩

Java基礎五十九-集合工具Java集框架

1:Stack棧 棧是一種先進後出的資料結構。例如:在文字編輯器上都有撤銷功能,那麼每次使用的時候,最後一次的編輯操作永遠是最先撤銷的,那麼這個功能就是利用棧來實現的,棧的基本操作形式如下。 案例:實現棧的操作 import java.util.Stack;

面試中常考的幾個集合java

這裡首先借用下網上的一張集合介面關係圖 下面簡述幾種常用集合的區別,還有部分不常用集合類未描述 Iterable迭代器介面,這是Collection類的父介面。實現這個Iterable介面的物件允許使用foreach進行遍歷,也就是說,所有的Collection集合物件都

JAVA核心技術I---JAVA基礎知識抽象和介面

一:抽象類 (一)定義 類:屬性(0或多個)+方法(0或多個)一個完整(健康)的類:所有的方法都有實現(方法體)類可以沒有方法,但是有方法就肯定要有實現,這才是一個完整的類一個完整的類才可以被例項化,被new出來如果一個類暫時有方法未實現,需要被定義為抽象類 (二)實現 抽象類關鍵字a

JAVA核心技術I---JAVA基礎知識時間 愉快且方便的處理時間-- LocalDate

一:時間類庫瞭解 java.util.Date(基本廢棄,Deprecated) –getTime(),返回自1970.1.1以來的毫秒數 java.sql.Date(和資料庫對應的時間類)  //與資料庫相應 Calendar是目前程式中最常用的,但是是抽象類兩種方法,返回都是一樣的

利用java生成UUID工具

package test.demo1; import java.util.UUID; public class UUIDUtil { public static String creatU

java:面向物件抽象的成員特點

/* *A:抽象類的成員特點: * a:成員變數:既可以是變數,也可以是常量。abstract是否可以修飾成員變數?不能修飾成員變數 * b:構造方法:有 * 用於子類訪問父類資料的初始化 * c:

呼叫WEKA包進行kmeans聚java

所用資料檔案:data1.txt @RELATION data1 @ATTRIBUTE one REAL @ATTRIBUTE two REAL @DATA 0.184000 0.482000 0.152000 0.540000 0.152000 0.5960