1. 程式人生 > >如何取得Spring管理的bean (請用第3種方法)

如何取得Spring管理的bean (請用第3種方法)

  如何取得Spring管理的bean  (請用第3種方法):

1、servlet方式載入時,
【web.xml】

Xml程式碼
  1. <servlet>  
  2. <servlet-name>springMVC</servlet-name>  
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4. <init-param>  
  5. <param-name>contExtConfigLocation</param-name
    >
      
  6. <param-value>classpath*:/springMVC.xml</param-value>  
  7. </init-param>  
  8. <load-on-startup>1</load-on-startup>  
  9. </servlet>  

 spring容器放在ServletContext中的key是org.springframework.web.servlet.FrameworkServlet.CONTEXT.springMVC
注意後面的springMVC,是你的servlet-name配置的值,注意適時修改。

Java程式碼
  1. ServletContext sc=略  
  2. WebApplicationContext attr = (WebApplicationContext)sc.getAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.springMVC");  

2、listener方式載入時:
【web.xml】

Xml程式碼
  1. <context-param>  
  2.   <param-name>contextConfigLocation</param-name>  
  3.   <param-value>/WEB-INF/applicationContext</
    param-value>
      
  4. </context-param>  
  5. <listener>  
  6.   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  7. </listener>  

 【jsp/servlet】可以這樣取得

Java程式碼
  1. ServletContext context = getServletContext();  
  2. WebApplicationContext applicationContext  = WebApplicationContextUtils .getWebApplicationContext(context);   

3、通用的方法來了,神器啊,前的  1、2兩種方法並不通用,可以拋棄了。
在配置檔案中加入:

Xml程式碼
  1. <!-- 用於持有ApplicationContext,可以使用SpringContextHolder.getBean('xxxx')的靜態方法得到spring bean物件 -->  
  2. <bean class="com.xxxxx.SpringContextHolder" lazy-init="false" />  
Java程式碼
  1. import org.springframework.context.ApplicationContext;  
  2. import org.springframework.context.ApplicationContextAware;  
  3. /** 
  4.  * 以靜態變數儲存Spring ApplicationContext, 可在任何程式碼任何地方任何時候中取出ApplicaitonContext. 
  5.  *  
  6.  */  
  7. public class SpringContextHolder implements ApplicationContextAware {  
  8. private static ApplicationContext applicationContext;  
  9. /** 
  10. * 實現ApplicationContextAware介面的context注入函式, 將其存入靜態變數. 
  11. */  
  12. public void setApplicationContext(ApplicationContext applicationContext) {  
  13. SpringContextHolder.applicationContext = applicationContext; // NOSONAR  
  14. }  
  15. /** 
  16. * 取得儲存在靜態變數中的ApplicationContext. 
  17. */  
  18. public static ApplicationContext getApplicationContext() {  
  19. checkApplicationContext();  
  20. return applicationContext;  
  21. }  
  22. /** 
  23. * 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值物件的型別. 
  24. */  
  25. @SuppressWarnings("unchecked")  
  26. public static <T> T getBean(String name) {  
  27. checkApplicationContext();  
  28. return (T) applicationContext.getBean(name);  
  29. }  
  30. /** 
  31. * 從靜態變數ApplicationContext中取得Bean, 自動轉型為所賦值物件的型別. 
  32. */  
  33. @SuppressWarnings("unchecked")  
  34. public static <T> T getBean(Class<T> clazz) {  
  35. checkApplicationContext();  
  36. return (T) applicationContext.getBeansOfType(clazz);  
  37. }  
  38. /** 
  39. * 清除applicationContext靜態變數. 
  40. */  
  41. public static void cleanApplicationContext() {  
  42. applicationContext = null;  
  43. }  
  44. private static void checkApplicationContext() {  
  45. if (applicationContext == null) {  
  46. throw new IllegalStateException("applicaitonContext未注入,請在applicationContext.xml中定義SpringContextHolder");  
  47. }  
  48. }  
  49. }