javascript
Spring容器中获取Bean实例的七种方式(附实战源码)
目錄
- 寫作說明
- 一:寫作原因
- 二:源碼出處
- 實(shí)現(xiàn)方式
- 一:使用BeanFactory直接獲取(不推薦)
- 二:在初始化時(shí)保存ApplicationContext對象
- 三:繼承自抽象類ApplicationObjectSupport
- 四:繼承自抽象類WebApplicationObjectSupport
- 五:使用Spring提供的工具類WebApplicationContextUtils
- 六:實(shí)現(xiàn)ApplicationContextAware接口
- 七:使用ContextLoader提供的getCurrentWebApplicationContext方法
寫作說明
一:寫作原因
首先解釋一下寫這篇博文的原因,因?yàn)樵谑褂胹pring框架的過程中獲取bean是非常常見的操作,但是網(wǎng)上非常的博文大多承自一家之言,因此很多可操作性上并不強(qiáng),本文是通過自己實(shí)戰(zhàn),親自嘗試之后提供的幾種方案,供大家一起學(xué)習(xí)探討。
二:源碼出處
本文出自原創(chuàng),如果您轉(zhuǎn)發(fā)請注明出處,另本文提供的測試代碼為chapter-1-springmvc-quickstart中的單元測試類BeanUtilTest如果有需要的可自行下載
實(shí)現(xiàn)方式
本文一共提供七種實(shí)現(xiàn)方式:
一:使用BeanFactory直接獲取(不推薦)
使用BeanFactory從工廠中直接獲取Bean實(shí)例,但是XmlBeanFactory類已經(jīng)廢棄,因此不建議使用,測試代碼如下:
/*** 方式一:XmlBeanFactory已經(jīng)廢棄不建議使用*/@Testpublic void getBeanTest1() {BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));UserInfo userInfo = (UserInfo) beanFactory.getBean("userInfo");System.out.println(userInfo);}二:在初始化時(shí)保存ApplicationContext對象
可以在初始化的時(shí)候保存ApplicationContext對象,然后通過這個對象獲取Bean,測試代碼如下:
/*** 方式二:使用ClassPathXmlApplicationContext獲取ApplicationContext*/@Testpublic void getBeanTest2() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");UserInfo userInfo = (UserInfo) applicationContext.getBean("userInfo");System.out.println(userInfo);}三:繼承自抽象類ApplicationObjectSupport
可以繼承抽象類ApplicationObjectSupport并將自己繼承的類注入到Spring容器中,示例代碼如下:
/*** 方法三:繼承ApplicationObjectSupport來獲取ApplicationContext,* 注意:需要把自己繼承的類注入到Spring*/@Testpublic void getBeanTest3() {ApplicationContextUtil2 applicationContextUtil2 = (ApplicationContextUtil2) ApplicationContextUtil.getBean("applicationContextUtil2");UserInfo userInfo = (UserInfo) applicationContextUtil2.getBean("userInfo");System.out.println(userInfo);}其中ApplicationContextUtil2的代碼如下所示:
public class ApplicationContextUtil2 extends ApplicationObjectSupport {/*** 通過bean的id獲取bean對象* @param beanName* @return*/public Object getBean(String beanName){return super.getApplicationContext().getBean(beanName);}}最后莫忘了將Bean注入到Spring容器中,通過注解,或者配置均可,本示例通過配置實(shí)現(xiàn)
<!-- 測試獲取bean的方式,繼承ApplicationObjectSupport需要先注入這個類 --><bean id="applicationContextUtil2" class="com.leo.util.ApplicationContextUtil2"></bean>四:繼承自抽象類WebApplicationObjectSupport
可以繼承抽象類WebApplicationObjectSupport并將自己繼承的類注入到Spring容器中,示例代碼如下:
/*** 方法四:繼承WebApplicationObjectSupport來獲取ApplicationContext,* 注意:需要把自己繼承的類注入到Spring,同時(shí)需要添加@WebAppConfiguration注解,否則會找不到web容器*/@Testpublic void getBeanTest4() {ApplicationContextUtil3 applicationContextUtil3 = (ApplicationContextUtil3) ApplicationContextUtil.getBean("applicationContextUtil3");UserInfo userInfo = (UserInfo) applicationContextUtil3.getBean("userInfo");System.out.println(userInfo);}其中ApplicationContextUtil3 的示例代碼如下:
public class ApplicationContextUtil3 extends WebApplicationObjectSupport{/*** 通過bean的id獲取bean對象* @param beanName* @return*/public Object getBean(String beanName){return super.getWebApplicationContext().getBean(beanName);}}最后莫忘了將Bean注入到Spring容器中,通過注解,或者配置均可,本示例通過配置實(shí)現(xiàn)
<!-- 測試獲取bean的方式,繼承WebApplicationObjectSupport需要先注入這個類 --><bean id="applicationContextUtil3" class="com.leo.util.ApplicationContextUtil3"></bean>五:使用Spring提供的工具類WebApplicationContextUtils
使用Spring提供的工具類WebApplicationContextUtils來獲取WebApplicationContext對象,這個方法很常見于SpringMVC構(gòu)建的web項(xiàng)目中,測試代碼如下所示:
/*** 方法五:使用WebApplicationContextUtils提供的方法獲取ApplicationContext對象*/@Testpublic void getBeanTest5(){//模擬ServletContext上下文,不然會出現(xiàn)空指針異常MockServletContext sc = new MockServletContext("");sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, "/applicationContext.xml");ServletContextListener listener = new ContextLoaderListener();ServletContextEvent event = new ServletContextEvent(sc);listener.contextInitialized(event);//使用WebApplicationContextUtils的getRequiredWebApplicationContext方法WebApplicationContext webApplicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);UserInfo userInfo = (UserInfo) webApplicationContext.getBean("userInfo");System.out.println(userInfo);//使用WebApplicationContextUtils的getWebApplicationContext方法WebApplicationContext webApplicationContext2 = WebApplicationContextUtils.getWebApplicationContext(sc);UserInfo userInfo2 = (UserInfo) webApplicationContext2.getBean("userInfo");System.out.println(userInfo2);}六:實(shí)現(xiàn)ApplicationContextAware接口
通過實(shí)現(xiàn)ApplicationContextAware接口,在Spring容器啟動的時(shí)候?qū)pplicationContext注入進(jìn)去,從而獲取ApplicationContext對象,這種方法也是常見的獲取Bean的一種方式,測試代碼如下:
/***方法六:實(shí)現(xiàn)ApplicationContextAware接口獲取ApplicationContext*/@Testpublic void getBeanTest6(){UserInfo userInfo2 = (UserInfo) ApplicationContextUtil.getBean("userInfo");System.out.println(userInfo2);}其中ApplicationContextUtil的實(shí)現(xiàn)如下:
public class ApplicationContextUtil implements ApplicationContextAware{private static ApplicationContext applicationContext;/*** 通過bean的id獲取bean對象* @param beanName* @return*/public static Object getBean(String beanName){return applicationContext.getBean(beanName);}/*** 根據(jù)bean的id和類型獲取bean對象* @param beanName* @param clazz* @param <T>* @return*/public static <T> T getBean(String beanName,Class<T> clazz){return clazz.cast(getBean(beanName));}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;} }七:使用ContextLoader提供的getCurrentWebApplicationContext方法
使用ContextLoader提供的getCurrentWebApplicationContext方法提供的方法也是常用的獲取WebApplicationContext的一種方法,這個方法常見于SpringMVC實(shí)現(xiàn)的web項(xiàng)目中。測試代碼如下:
/*** 方法七:使用ContextLoader的getCurrentWebApplicationContext方法獲取WebApplicationContext*/@Testpublic void getBeanTest7() {MockServletContext sc = new MockServletContext("");sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM, "/applicationContext.xml");ServletContextListener listener = new ContextLoaderListener();ServletContextEvent event = new ServletContextEvent(sc);listener.contextInitialized(event);//如果不加上面的模擬創(chuàng)建ServletContext對象,會報(bào)空指針異常WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();UserInfo userInfo = (UserInfo) wac.getBean("userInfo");System.out.println(userInfo);} 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Spring容器中获取Bean实例的七种方式(附实战源码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringMVC学习(一)——快速搭建
- 下一篇: SpringMVC中过滤器和拦截器的区别