1. ApplicationContext ac1 = new FileSystemXmlApplicationContext("com/spark/system/applicationContext.xml");//如果配置文件放在文件系统的目录下则优先使用该方式
  2. //com/spark/system/applicationContext.xml等价于"file:com/spark/system/applicationContext.xml"
  3. ac1.getBean("beanId");
  4. //ApplicationContext ac2=new ClassPathXmlApplicationContext("com/spark/system/applicationContext.xml");//如果配置文件在类路径下则优先使用该方式
  5. //com/spark/system/applicationContext.xml 等价于"classpath:com/spark/system/applicationContext.xml"
  6. ac2.getBean("beanId");

说明:

这种方式适用于采用Spring框架的独立应用程序,需要程序通过配置文件手工初始化Spring的情况。


  1. public void getBean(HttpServletRequest req,HttpSession se)
  2. {
  3. // se.getServletContext() 也可以
  4. WebApplicationContext wac=(WebApplicationContext)req.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
  5. wac.getBean("");
  6. }

说明:此种方式正是我们下面所提到的WebApplicationContextUtils 工具类中getWebApplicationContext(ServletContext sc) 方法的内部实现,以下方式是通过spring 提供的WebApplicationContextUtils 工具类获取WebApplicationContext

方式一:


  1. import org.springframework.web.context.support.WebApplicationContextUtils;
  2. ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)
  3. ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
  4. ac1.getBean("beanId");
  5. ac2.getBean("beanId");

说明:

这种方式适合于采用Spring框架的B/S系统,通过ServletContext对象获取ApplicationContext对象,然后在通过它获取需要的类实例。

上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。

方式二:


  1. import org.springframework.web.context.WebApplicationContext;
  2. import org.springframework.web.context.support.WebApplicationObjectSupport;
  3. public class ApplicationContextUtils extends WebApplicationObjectSupport{
  4. public WebApplicationContext isgetWebApplicationContext(){
  5. return super.getWebApplicationContext();
  6. }
  7. }

继承自抽象类WebApplicationObjectSupport

说明:

抽象类WebApplicationObjectSupport 继承自ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该ApplicationObjectSupport 的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。当然直接继承ApplicationObjectSupport自己实现也可以,既然spring
提供了更方便的抽象工具类WebApplicationObjectSupport 建议使用它。以免出现问题

下面看WebApplicationObjectSupport关键源码(红色部分)


  1. /*** Eclipse Class Decompiler, copyright (c) 2012 cnfree (cnfree2000@hotmail.com) ***/
  2. package org.springframework.web.context.support;
  3. import java.io.File;
  4. import javax.servlet.ServletContext;
  5. import org.springframework.context.ApplicationContext;
  6. import org.springframework.context.support.ApplicationObjectSupport;
  7. import org.springframework.web.context.ServletContextAware;
  8. import org.springframework.web.context.WebApplicationContext;
  9. import org.springframework.web.util.WebUtils;
  10. public abstract class WebApplicationObjectSupport <span style="color:#FF0000;">extends ApplicationObjectSupport</span> implements ServletContextAware{
  11. private ServletContext servletContext;
  12. public final void setServletContext(ServletContext servletContext){
  13. if (servletContext != this.servletContext){
  14. this.servletContext = servletContext;
  15. if (servletContext != null) initServletContext(servletContext);
  16. }
  17. }
  18. protected boolean isContextRequired(){
  19. return true;
  20. }
  21. protected void initApplicationContext(ApplicationContext context){
  22. super.initApplicationContext(context);
  23. if ((this.servletContext == null)
  24. && (context instanceof WebApplicationContext)){
  25. this.servletContext = ((WebApplicationContext)context)
  26. .getServletContext();
  27. if (this.servletContext != null)
  28. initServletContext(this.servletContext);
  29. }
  30. }
  31. protected void initServletContext(ServletContext servletContext){}
  32. <span style="color:#FF0000;">protected final WebApplicationContext getWebApplicationContext()
  33. throws IllegalStateException{
  34. ApplicationContext ctx = getApplicationContext();
  35. if (ctx instanceof WebApplicationContext){ return ((WebApplicationContext)getApplicationContext()); }
  36. if (isContextRequired()){ throw new IllegalStateException(
  37. "WebApplicationObjectSupport instance [" + this
  38. + "] does not run in a WebApplicationContext but in: "
  39. + ctx); }
  40. return null;
  41. }</span>
  42. protected final ServletContext getServletContext()
  43. throws IllegalStateException{
  44. if (this.servletContext != null){ return this.servletContext; }
  45. ServletContext servletContext = getWebApplicationContext()
  46. .getServletContext();
  47. if ((servletContext == null) && (isContextRequired())){ throw new IllegalStateException(
  48. "WebApplicationObjectSupport instance ["
  49. + this
  50. + "] does not run within a ServletContext. Make sure the object is fully configured!"); }
  51. return servletContext;
  52. }
  53. protected final File getTempDir() throws IllegalStateException{
  54. return WebUtils.getTempDir(getServletContext());
  55. }
  56. }

下面是ApplicationObjectSupport源码


  1. /*** Eclipse Class Decompiler, copyright (c) 2012 cnfree (cnfree2000@hotmail.com) ***/
  2. package org.springframework.context.support;
  3. import org.apache.commons.logging.Log;
  4. import org.apache.commons.logging.LogFactory;
  5. import org.springframework.beans.BeansException;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.ApplicationContextAware;
  8. import org.springframework.context.ApplicationContextException;
  9. public abstract class ApplicationObjectSupport implements
  10. ApplicationContextAware{
  11. protected final Log logger;
  12. private ApplicationContext applicationContext;
  13. private MessageSourceAccessor messageSourceAccessor;
  14. public ApplicationObjectSupport(){
  15. this.logger = LogFactory.getLog(super.getClass());
  16. }
  17. public final void setApplicationContext(ApplicationContext context)
  18. throws BeansException{
  19. if ((context == null) && (!(isContextRequired()))){
  20. this.applicationContext = null;
  21. this.messageSourceAccessor = null;
  22. }
  23. else if (this.applicationContext == null){
  24. if (!(requiredContextClass().isInstance(context))){ throw new ApplicationContextException(
  25. "Invalid application context: needs to be of type ["
  26. + requiredContextClass().getName() + "]"); }
  27. this.applicationContext = context;
  28. this.messageSourceAccessor = new MessageSourceAccessor(context);
  29. initApplicationContext(context);
  30. }
  31. else if (this.applicationContext != context){ throw new ApplicationContextException(
  32. "Cannot reinitialize with different application context: current one is ["
  33. + this.applicationContext + "], passed-in one is ["
  34. + context + "]"); }
  35. }
  36. protected boolean isContextRequired(){
  37. return false;
  38. }
  39. protected Class requiredContextClass(){
  40. return ApplicationContext.class;
  41. }
  42. protected void initApplicationContext(ApplicationContext context)
  43. throws BeansException{
  44. initApplicationContext();
  45. }
  46. protected void initApplicationContext() throws BeansException{}
  47. public final ApplicationContext getApplicationContext()
  48. throws IllegalStateException{
  49. if ((this.applicationContext == null) && (isContextRequired())){ throw new IllegalStateException(
  50. "ApplicationObjectSupport instance [" + this
  51. + "] does not run in an ApplicationContext"); }
  52. return this.applicationContext;
  53. }
  54. protected final MessageSourceAccessor getMessageSourceAccessor()
  55. throws IllegalStateException{
  56. if ((this.messageSourceAccessor == null) && (isContextRequired())){ throw new IllegalStateException(
  57. "ApplicationObjectSupport instance [" + this
  58. + "] does not run in an ApplicationContext"); }
  59. return this.messageSourceAccessor;
  60. }
  61. }

通过源码很容易看得出spring做的这两次封装是如何获取到WebApplicationContext的  当然自己也可以实现底层接口自己封装。

比如:继承自抽象类ApplicationObjectSupport,抽象类ApplicationObjectSupport提供getApplicationContext()方法,可以方便的获取到ApplicationContext。Spring初始化时,会通过该抽象类的setApplicationContext(ApplicationContext context)方法将ApplicationContext 对象注入。

再比如:实现接口ApplicationContextAware,实现该接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 对象。Spring初始化时,会通过该方法将ApplicationContext 对象注入。

以上方法适合不同的情况,请根据具体情况选用相应的方法。

这里值得提一点的是,系统中用到上述方法的类实际上就于Spring框架紧密耦合在一起了,因为这些类是知道它们是运行在Spring框架上的,因此,系统中,应该尽量的减少这类应用,使系统尽可能的独立于当前运行环境,尽量通过DI的方式获取需要的服务提供者。

PS:除了通过applicationContext来手动获取getBean("beanId")之外,还可以通过beanfactory工厂的.getBean("beanId")获取Bean 实例

例如:


  1. ResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
  2. Resource resource=resolver.getResource("classpath:com/**/beans.xml");
  3. BeanFactory bf=new XmlBeanFactory(resource);
  4. bf.getBean("beanId");

有待研究 通过BeanFactory.getBean和ApplicationContext.getBean 的异同解释,和利弊以及使用情况。志同道合的同志可随时留言讨论,小弟欢迎大家一起学习

本文属于原创,请勿抄袭,谢谢!

最新文章

  1. SQLite3的基本使用
  2. javascript日历控件
  3. NeuSoft(4)编写字符设备驱动
  4. What&#39;s New in iOS9 iOS9功能改进
  5. DICOM:DICOM3.0网络通信协议
  6. ASP开发中服务器控件和普通控件的区别
  7. Codeforces Round #290 (Div. 2) A. Fox And Snake 水题
  8. LintCode-Word Segmentation
  9. Aspcms所有标签调用
  10. 场景类(CCSence)
  11. MVVM框架avalon在兼容旧式IE
  12. Mysql存储过程和函数
  13. iOS中动态计算不同颜色、字体的文字高度
  14. python3 字符串str
  15. 第三届山西省赛1004 一道大水题(scanf)
  16. object references an unsaved transient instance save the transient instance before flushing
  17. linux shell创建目录、遍历子目录
  18. P问题,NP问题,NPC问题,NP-hard问题
  19. 关于电商ERP的想法
  20. 零碎知识点 telnet操作IMAP查看邮件

热门文章

  1. 原生JS实现页面内定位
  2. RecyclerView具体解释
  3. python中lambda的另类使用
  4. Android经常使用自己定义控件(二)
  5. Python - 字典按值(value)排序
  6. js---25桥模式
  7. js18--继承方式
  8. Android学习笔记技巧之给文本加边框
  9. Eclipse中自动添加注释
  10. vmware workstation安装windows server 2019