熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

spring中讀取xml配置文件、獲取bean

2022-06-13   來源: Java開源技術 

  讀取xml文件

  /**

  * 利用XmlBeanFactory(Resource resource)

  * 這裡Resource必須是xml格式

  * Resource包括AbstractResource ClassPathResource FileSystemResource

  * InputStreamResource ServletContextResource UrlResource

  */

  /*

  * 利用 InputStreamResource(InputStream inputStream)

  * 要將applicationContextxml放在項目根目錄下

  */

  InputStream is = null;

  try {

  is = new FileInputStream(applicationContextxml);

  } catch (FileNotFoundException e) {

  eprintStackTrace();

  }

  Resource resource = new InputStreamResource(is);

  BeanFactory factory = new XmlBeanFactory(resource);

  UserDao userDao = (UserDao)factorygetBean(userDao);

  /*

  * 利用 Properties

  * 要將beanproperties放在類路徑--源文件夾(src)目錄下

  */

  具體見

  利用ClassPathXmlApplicationContext

  可以從classpath中讀取XML文件

  () ApplicationContext context = new ClassPathXmlApplicationContext(applicationContextxml);

  UserDao userDao = (UserDao)contextgetBean(userDao);

  () ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(new  String[]{applicationContextibatisoraclexmlapplicationContextxmlapplicationContextdataoraclexml});

  BeanFactory factory = resource;

  UserDao userDao = (UserDao) factorygetBean(userDao);

   利用ClassPathResource

  可以從classpath中讀取XML文件

  Resource cr = new ClassPathResource(applicationContextxml);

  BeanFactory bf=new XmlBeanFactory(cr);

  UserDao userDao = (UserDao)bfgetBean(userDao);

  加載一個xml文件 orgspringframewonfigPropertyPlaceholderConfigurer不起作用

  .利用XmlWebApplicationContext讀取

  從Web應用程序的文件架構中指定相對位置來讀取定義文件

  XmlWebApplicationContext 的建構子無法帶參數參考API文件會發現預設的location會指向/WEBINF/applicationContextxml檔案使用其 public static屬性DEFAULT_CONFIG_LOCATION可取得此預設檔名由於我使用MyEclipse預設會多一個/WebRoot的 目錄在WEBINF之前因此若在web project裡有一些與web無關的程式要使用context時(例如處理一些MVC架構中的M的部份)就無法使用 XmlWebApplicationContext來讀取bean定義檔因為default location會差一個WebRoot的目錄

  即 使在webxml裡面在DispatcherServlet定義中重新定義contextConfigLocation也一樣(此定義可以 override掉XmlWebApplicationContext中的DEFAULT_CONFIG_LOCATION值)因為與web無關的程式 並不會經過webxml的定義檔設定目前我還沒試成功過XmlWebApplicationContext取得bean定義檔使用 ClassPathXmlApplicationContext反而會快一些

  XmlWebApplicationContext ctx = new XmlWebApplicationContext();

  ctxsetConfigLocations(new String[] {/WEBINF/ applicationContextxml);

  ctxsetServletContext(pageContextgetServletContext());

  ctxrefresh();

  UserDao  userDao = (UserDao ) ctxgetBean(userDao );

  利用FileSystemResource讀取

  Resource rs = new FileSystemResource(D:/tomcat/webapps/test/WEBINF/classes/ applicationContextxml);

  BeanFactory factory = new XmlBeanFactory(rs);

  UserDao  userDao  = (UserDao )factorygetBean(userDao);

  值得注意的是利用FileSystemResource則配置文件必須放在project直接目錄下或者寫明絕對路徑否則就會拋出找不到文件的異常

  .利用FileSystemXmlApplicationContext讀取

  可以指定XML定義文件的相對路徑或者絕對路徑來讀取定義文件

  方法一

  String[]   path={WebRoot/WEBINF/applicationContextxmlWebRoot/WEBINF/applicationContext_taskxml};

  ApplicationContext context = new FileSystemXmlApplicationContext(path);

  方法二

  String path=WebRoot/WEBINF/applicationContext*xml;

  ApplicationContext context = new FileSystemXmlApplicationContext(path);

  方法三

  ApplicationContext ctx =

  new FileSystemXmlApplicationContext(classpath:地址);

  沒有classpath的話就是從當前的工作目錄

  *******************************************************************************

  **         分割一下                                                                                                            **

  *******************************************************************************

  獲取Spring框架管理的類實例的方法有多種如下

  方法一在初始化時保存ApplicationContext對象

  代碼

  ApplicationContext ac = new FileSystemXmlApplicationContext(applicationContextxml);

  acgetBean(beanId);

  說明

  這種方式適用於采用Spring框架的獨立應用程序需要程序通過配置文件手工初始化Spring的情況

  方法二通過Spring提供的工具類獲取ApplicationContext對象

  代碼

  import orgsprntextsupportWebApplicationContextUtils;

  ApplicationContext ac =

  WebApplicationContextUtilsgetRequiredWebApplicationContext(ServletContext sc)

  ApplicationContext ac = WebApplicationContextUtilsgetWebApplicationContext(ServletContext

  sc)

  acgetBean(beanId);

  acgetBean(beanId);

  說明

  這種方式適合於采用Spring框架的B/S系統通過ServletContext對象獲取ApplicationContext對象然後

  在通過它獲取需要的類實例

  上面兩個工具方式的區別是前者在獲取失敗時拋出異常後者返回null

  方法三繼承自抽象類ApplicationObjectSupport

  說明

  抽象類ApplicationObjectSupport提供getApplicationContext()方法可以方便的獲取到 ApplicationCont

  extSpring初始化時會通過該抽象類的setApplicationContext(ApplicationContext

  context)方法將ApplicationContext 對象注入

  方法四繼承自抽象類WebApplicationObjectSupport

  說明

  類似上面方法調用getWebApplicationContext()獲取WebApplicationContext

  方法五實現接口ApplicationContextAware

  說明

  實現該接口的setApplicationContext(ApplicationContext context)方法並保存ApplicationContext 對

  象Spring初始化時會通過該方法將ApplicationContext 對象注入

  以上方法適合不同的情況請根據具體情況選用相應的方法

  這裡值得提一點的是系統中用到上述方法的類實際上就於Spring框架緊密耦合在一起了因為這些類是知

  道它們是運行在Spring框架上的因此系統中應該盡量的減少這類應用使系統盡可能的獨立於當前運

  行環境盡量通過DI的方式獲取需要的服務提供者

  本人認為方法五比較可行可以設計一個工具類專門來獲取Spring中的類減少對業務代碼的侵入性


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28302.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.