javascript
Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
?Spring獲取ApplicationContext方式
我自己常用的方法:
讀取一個文件1 //創建Spring容器 2 ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml"); 3 //獲取chinese 實例 4 Person p = ctx.getBean("chinese" , Person.class); //或者 Person p = (Person)ctx.getBean("chinese"); 5 //調用useAxe()方法
6 p.useAxe(); 讀取多個文件 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[] {"bean1.xml","bean2.xml","bean3.xml"});
Person p = (Person)ctx.getBean("chinese"); p.useAxe();
?
其它方法:
方法一:在初始化時保存ApplicationContext對象?
代碼:?
說明:?
這種方式適用于采用Spring框架的獨立應用程序(C/S結構應用),需要程序通過配置文件手工初始化Spring的情況。
方法二:通過Spring提供的工具類獲取ApplicationContext對象?
代碼:
說明:?
這種方式適合于采用Spring框架的B/S系統,通過ServletContext對象獲取ApplicationContext對象,然后在通過它獲取需要的類實例。?
上面兩個工具方式的區別是,前者在獲取失敗時拋出異常,后者返回null。
其中 servletContext sc 可以具體換成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext();
另外,由于spring是注入的對象放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 對象:
WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
方法三:繼承自抽象類ApplicationObjectSupport?
說明:?
抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。
?
方法四:繼承自抽象類WebApplicationObjectSupport?
說明:?
類似上面方法,調用getWebApplicationContext()獲取WebApplicationContext
?
方法五:實現接口ApplicationContextAware?
說明:?
實現該接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 對象。Spring初始化時,會通過該方法將ApplicationContext 對象注入。
以上方法適合不同的情況,請根據具體情況選用相應的方法。
這里值得提一點的是,系統中用到上述方法的類實際上就與Spring框架緊密耦合在一起了,因為這些類是知道它們是運行在Spring框架上的,因此,系統中,應該盡量的減少這類應用,使系統盡可能的獨立于當前運行環境,盡量通過DI的方式獲取需要的服務提供者。
本人認為,方法五比較可行,可以設計一個工具類,專門來獲取Spring中的類。減少對業務代碼的侵入性。
?
加載xml文件的幾種方式:
?
1.利用ClassPathXmlApplicationContext
可以從classpath中讀取XML文件
(1) ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");?
UserDao userDao = (UserDao)context.getBean("userDao");
(2) ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(new? String[]{"applicationContext-ibatis-oracle.xml","applicationContext.xml","applicationContext-data-oracle.xml"});
BeanFactory factory = resource;
UserDao userDao = (UserDao) factory.getBean("userDao");
2. 利用XmlBeanFactory、ClassPathResource(Resource?resource)
例1:
可以從classpath中讀取XML文件
Resource cr = new ClassPathResource("applicationContext.xml");BeanFactory bf=new XmlBeanFactory(cr);UserDao userDao = (UserDao)bf.getBean("userDao");?
加載一個xml文件org.springframework.beans.factory.config.PropertyPlaceholderConfigurer不起作用
注意:這里Resource必須是xml格式?
* Resource包括:AbstractResource, ClassPathResource, FileSystemResource,?
* InputStreamResource, ServletContextResource, UrlResource?
例2:
/* * 利用 InputStreamResource(InputStream inputStream) * 要將applicationContext.xml放在項目根目錄下 */ InputStream is = null; try { is = new FileInputStream("applicationContext.xml"); } catch (FileNotFoundException e) { e.printStackTrace(); } Resource resource = new InputStreamResource(is); BeanFactory factory = new XmlBeanFactory(resource); UserDao userDao = (UserDao)factory.getBean("userDao");?
3.利用XmlWebApplicationContext讀取
從Web應用程序的文件架構中,指定相對位置來讀取定義文件。
XmlWebApplicationContext 的建構子無法帶參數,參考API文件會發現,預設的location會指向/WEB-INF/applicationContext.xml檔案。使用其 public static屬性DEFAULT_CONFIG_LOCATION可取得此預設檔名。由於我使用MyEclipse,預設會多一個"/WebRoot"的 目錄在WEB-INF之前,因此若在web project裡有一些與web無關的程式要使用context時(例如處理一些MVC架構中的"M"的部份),就無法使用 XmlWebApplicationContext來讀取bean定義檔,因為default location會差一個"WebRoot"的目錄。?
即 使在web.xml裡面,在DispatcherServlet定義中重新定義contextConfigLocation也一樣(此定義可以 override掉XmlWebApplicationContext中的DEFAULT_CONFIG_LOCATION值),因為與web無關的程式 並不會經過web.xml的定義檔設定。目前我還沒試成功過XmlWebApplicationContext取得bean定義檔,使用 ClassPathXmlApplicationContext反而會快一些。
?
4.利用FileSystemResource讀取
Resource rs = new FileSystemResource("D:/tomcat/webapps/test/WEB-INF/classes/ applicationContext.xml"); BeanFactory factory = new XmlBeanFactory(rs); UserDao userDao = (UserDao )factory.getBean("userDao");值得注意的是:利用FileSystemResource,則配置文件必須放在project直接目錄下,或者寫明絕對路徑,否則就會拋出找不到文件的異常
?
5.利用FileSystemXmlApplicationContext讀取
可以指定XML定義文件的相對路徑或者絕對路徑來讀取定義文件。
方法一:
String[] path={"WebRoot/WEB-INF/applicationContext.xml","WebRoot/WEB-INF/applicationContext_task.xml"}; ApplicationContext context = new FileSystemXmlApplicationContext(path);方法二:
String path="WebRoot/WEB-INF/applicationContext*.xml"; ApplicationContext context = new FileSystemXmlApplicationContext(path);方法三:?
ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:地址");沒有classpath的話就是從當前的工作目錄
from:?http://chinazhaokeke.blog.163.com/blog/static/109409055201092811354236
http://www.cnblogs.com/x_wukong/p/3948275.html
總結
以上是生活随笔為你收集整理的Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring里头各种获取Applicat
- 下一篇: 提高 Java 代码质量