日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring容器中获取Bean实例的七种方式(附实战源码)

發(fā)布時(shí)間:2025/3/19 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring容器中获取Bean实例的七种方式(附实战源码) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

        • 寫作說明
          • 一:寫作原因
          • 二:源碼出處
        • 實(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。