我們知道如果我們要在一個(gè)類使用spring提供的bean對象件相,我們需要把這個(gè)類注入到spring容器中蓄喇,交給spring容器進(jìn)行管理袒炉,但是在實(shí)際當(dāng)中疙赠,我們往往會(huì)碰到在一個(gè)普通的Java類中付材,想直接使用spring提供的其他對象或者說有一些不需要交給spring管理,但是需要用到spring里的一些對象圃阳。如果這是spring框架的獨(dú)立應(yīng)用程序厌衔,我們通過
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
這樣的方式就可以很輕易的獲取我們所需要的對象。
但是往往我們所做的都是Web Application捍岳,這時(shí)我們啟動(dòng)spring容器是通過在web.xml文件中配置富寿,這樣就不適合使用上面的方式在普通類去獲取對象了睬隶,因?yàn)檫@樣做就相當(dāng)于加載了兩次spring容器,而我們想是否可以通過在啟動(dòng)web服務(wù)器的時(shí)候页徐,就把Application放在某一個(gè)類中苏潜,我們通過這個(gè)類在獲取,這樣就可以在普通類獲取spring bean對象了变勇。
本文檔介紹在springboot中普通類是如何獲取Spring容器中的bean窖贤。其實(shí)很簡單,只需要在項(xiàng)目中添加一個(gè)工具類贰锁,我這里創(chuàng)建的工具類名稱為SpringBootBeanUtil ,實(shí)現(xiàn)ApplicationContextAware接口滤蝠,并加入Component注解豌熄,讓springboot掃描到該bean,就可以通過工具類中的四個(gè)靜態(tài)方法獲取到ApplicationContext或直接獲取到Spring管理的類物咳。
package org.lvgang;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* SpringBoot 普通類獲取Spring容器中的bean工具類
* @author lvgang
*/
@Component
public class SpringBootBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringBootBeanUtil.applicationContext == null) {
SpringBootBeanUtil.applicationContext = applicationContext;
}
System.out.println("========ApplicationContext配置成功========");
System.out.println("========在普通類可以通過調(diào)用SpringUtils.getAppContext()獲取applicationContext對象========");
System.out.println("========applicationContext="+ SpringBootBeanUtil.applicationContext +"========");
}
/**
* 獲取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通過name獲取 Bean.
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通過class獲取Bean.
* @param clazz
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通過name,以及Clazz返回指定的Bean
* @param name
* @param clazz
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}