資料新增非同步解析重新整理大資料量redis (——)(三)Spring Boot普通類呼叫bean【從零開始學Spring Boot】
- 部落格分類:
- 從零開始學Spring Boot
從零開始學Spring BootSpring Boot普通類呼叫bean
【視訊&交流平臺】
http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share
http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share
https://gitee.com/happyangellxq520/spring-boot
http://412887952-qq-com.iteye.com/blog/2321532
我們知道如果我們要在一個類使用spring提供的bean物件,我們需要把這個類注入到spring容器中,交給spring容器進行管理,但是在實際當中,我們往往會碰到在一個普通的Java類中,想直接使用spring提供的其他物件或者說有一些不需要交給
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
這樣的方式就可以很輕易的獲取我們所需要的物件。
但是往往我們所做的都是Web Application,這時我們啟動spring容器是通過在
----------------------------------------------------------
普通類呼叫Spring bean物件:
可以參考:http://412887952-qq-com.iteye.com/blog/1479445
---------------------------------------------------------------------------------------------------------
這裡有更多這方面的介紹,比較詳細,在這裡只是拋裝引玉說明在Spring Boot是如何進行呼叫的。
17.1 在Spring Boot可以掃描的包下
假設我們編寫的工具類為SpringUtil。
如果我們編寫的SpringUtil在Spring Boot可以掃描的包下或者使用@ComponentScan引入自定義的包了,那麼原理很簡單,只需要使得SpringUtil實現介面:ApplicationContextAware,然後加上@Component 註解即可,具體編碼如下:
com.kfit.base.util.SpringUtil:
package com.kfit.base.util;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* 普通類呼叫Spring bean物件:
* 說明:
* 1、此類需要放到App.java同包或者子包下才能被掃描,否則失效。
* @author Administrator
*/
@Component
public class SpringUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null){
SpringUtil.applicationContext = applicationContext;
}
System.out.println("---------------------------------------------------------------------");
System.out.println("---------------------------------------------------------------------");
System.out.println("---------------com.kfit.base.util.SpringUtil------------------------------------------------------");
System.out.println("========ApplicationContext配置成功,在普通類可以通過呼叫SpringUtils.getAppContext()獲取applicationContext物件,applicationContext="+SpringUtil.applicationContext+"========");
System.out.println("---------------------------------------------------------------------");
}
//獲取applicationContext
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
//通過name獲取 Bean.
publicstatic Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通過class獲取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通過name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
啟動應用,檢視控制檯的列印資訊是否有:
======ApplicationContext配置成功,在普通類可以通過呼叫SpringUtils.getAppContext()獲取applicationContext物件,
17.2 不在Spring Boot的掃描包下方式一
這種情況處理起來也很簡單,先編寫SpringUtil類,同樣需要實現介面:ApplicationContextAware,具體編碼如下:
simple.plugin.spring.SpringUtil
package simple.plugin.spring;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class SpringUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringUtil.applicationContext == null){
SpringUtil.applicationContext = applicationContext;
}
System.out.println("---------------------------------------------------------------------");
System.out.println("---------------------------------------------------------------------");
System.out.println("---------------simple.plugin.spring.SpringUtil------------------------------------------------------");
System.out.println("========ApplicationContext配置成功,在普通類可以通過呼叫SpringUtils.getAppContext()獲取applicationContext物件,applicationContext="+SpringUtil.applicationContext+"========");
System.out.println("---------------------------------------------------------------------");
}
//獲取applicationContext
public static ApplicationContext getApplicationContext() {
returnapplicationContext;
}
//通過name獲取 Bean.
public static Object getBean(String name){
return getApplicationContext().getBean(name);
}
//通過class獲取Bean.
public static <T> T getBean(Class<T> clazz){
return getApplicationContext().getBean(clazz);
}
//通過name,以及Clazz返回指定的Bean
public static <T> T getBean(String name,Class<T> clazz){
return getApplicationContext().getBean(name, clazz);
}
}
之後這一步才是關鍵,使用@Bean註解,在App.java類中將SpringUtil註解進來,程式碼如下:
package com.kfit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Import;
import simple.plugin.spring.SpringUtil;
/**
* Hello world!
*
*/
//其中@SpringBootApplication申明讓spring boot自動給程式進行必要的配置,等價於以預設屬性使用@Configuration,@EnableAutoConfiguration和@ComponentScan
@SpringBootApplication
@ServletComponentScan
public class App {
/**註冊Spring Util
* 這裡為了和上一個衝突,所以方面名為:springUtil2
* 實際中使用springUtil
*/
@Bean
public SpringUtil springUtil2(){return new SpringUtil();}
/**
*
引數裡VM引數設定為:
-javaagent:.\lib\springloaded-1.2.4.RELEASE.jar -noverify
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
17.3 不在Spring Boot的掃描包下方式二
程式碼基本和上面都是相同的,主要是在App.java中使用@Import進行匯入。
而且在SpringUtil是不需要新增@Component註解
@SpringBootApplication
@ServletComponentScan
@Import(value={SpringUtil.class})
publicclass App {
//省略其它程式碼.
}
說明以上3中方式都生效了,這3中方式根據實際情況選擇一種方式就可以了。
那麼這樣子在普通類既可以使用:
SpringUtil.getBean() 獲取到Spring IOC容器中的bean。
當然也可以在Spring管理的類中使用:
@Resouce或者@Autowired 進行注入使用,當然我們這個類的核心是普通類可以呼叫spring的bean進行使用了,是不是很神奇呢。