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
GregoranCalandar類(java核心P103)
package com.cx.test; import java.text.DateFormatSymbols; import java.util.Calendar; import java.util.GregorianCalendar; public class CalendarTest {
Triangle2D類(Java)
定義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