Spring在程式碼中獲取bean的幾種方式

bingguang1993發表於2018-05-09

方法一:在初始化時儲存ApplicationContext物件 
方法二:通過Spring提供的utils類獲取ApplicationContext物件 
方法三:繼承自抽象類ApplicationObjectSupport 
方法四:繼承自抽象類WebApplicationObjectSupport 
方法五:實現介面ApplicationContextAware 
方法六:通過Spring提供的ContextLoader

獲取spring中bean的方式總結: 

方法一:在初始化時儲存ApplicationContext物件
  1. ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
  2. ac.getBean("userService");//比如:<bean id="userService" class="com.cloud.service.impl.UserServiceImpl"></bean>

說明:這樣的方式適用於採用Spring框架的獨立應用程式,須要程式通過配置檔案手工初始化Spring的情況。

方法二:通過Spring提供的工具類獲取ApplicationContext物件

  1. ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
  2. ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
  3. ac1.getBean("beanId");
  4. ac2.getBean("beanId");

說明:這樣的方式適合於採用Spring框架的B/S系統,通過ServletContext物件獲取ApplicationContext物件。然後在通過它獲取須要的類例項。上面兩個工具方式的差別是,前者在獲取失敗時丟擲異常。後者返回null。

方法三:繼承自抽象類ApplicationObjectSupport


說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法。能夠方便的獲取ApplicationContext。

Spring初始化時。會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 物件注入。

方法四:繼承自抽象類WebApplicationObjectSupport


說明:類似上面方法。呼叫getWebApplicationContext()獲取WebApplicationContext

方法五:實現介面ApplicationContextAware


說明:實現該介面的setApplicationContext(ApplicationContext context)方法,並儲存ApplicationContext 物件。Spring初始化時,會通過該方法將ApplicationContext物件注入。

下面是實現ApplicationContextAware介面方式的程式碼,前面兩種方法類似:

  1. public class SpringContextUtil implements ApplicationContextAware {
  2. // Spring應用上下文環境
  3. private static ApplicationContext applicationContext;
  4. /**
  5. * 實現ApplicationContextAware介面的回撥方法。設定上下文環境
  6. *
  7. * @param applicationContext
  8. */
  9. public void setApplicationContext(ApplicationContext applicationContext) {
  10. SpringContextUtil.applicationContext = applicationContext;
  11. }
  12. /**
  13. * @return ApplicationContext
  14. */
  15. public static ApplicationContext getApplicationContext() {
  16. return applicationContext;
  17. }
  18. /**
  19. * 獲取物件
  20. *
  21. * @param name
  22. * @return Object
  23. * @throws BeansException
  24. */
  25. public static Object getBean(String name) throws BeansException {
  26. return applicationContext.getBean(name);
  27. }
  28. }

儘管,spring提供的後三種方法能夠實如今普通的類中繼承或實現對應的類或介面來獲取spring 的ApplicationContext物件,可是在使用是一定要注意實現了這些類或介面的普通java類一定要在Spring 的配置檔案applicationContext.xml檔案裡進行配置。否則獲取的ApplicationContext物件將為null。

方法六:通過Spring提供的ContextLoader
  1. WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
  2. wac.getBean(beanID);

最後提供一種不依賴於servlet,不須要注入的方式。可是須要注意一點,在server啟動時。Spring容器初始化時,不能通過下面方法獲取Spring 容器,細節能夠檢視spring原始碼org.springframework.web.context.ContextLoader。

相關文章