WebApplicationContext初始化的三种方式
来源:互联网 发布:windows logo含义 编辑:程序博客网 时间:2024/05/17 08:08
ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了;在Web应用中,我们会用到WebApplicationContext,WebApplicationContext继承自ApplicationContext;WebApplicationContext的初始化方式和BeanFactory.ApplicationContext有所区别,因为WebApplicationContext需要ServletContext实例,也就是说它必须拥有Web容器的前提下才能完成启动的工作.有过Web开发经验的读者都知道可以在web.xml中配置自启动的Servlet或定义Web容器监听器(ServletContextListener),借助着两者中的任何一个,我们就可以启动Spring Web应用上下文的工作.
Spring分别提供了用于启动WebApplicationContext的Servlet和Web容器监听器:
- 1
- 2
- 3
这两个方法都是在web应用启动的时候来初始化WebApplicationContext,我个人认为Listerner要比Servlet更好一些,因为Listerner监听应用的启动和结束,而Servlet得启动要稍微延迟一些,如果在这时要做一些业务的操作,启动的前后顺序是有影响的。
配置例子如下:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
那么在ContextLoaderListener和ContextLoaderServlet中到底做了什么呢?
以ContextLoaderListener为例,我们可以看到
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
显然,ContextLoaderListener实现了ServeletContextListenet,在ServletContext初始化的时候,会进行Spring的初始化,大家肯定会想,Spring的初始化应该与ServletContext有一定关系吧?有关系吗?接下来让我们看看
ContextLoader.initWebApplicationContext方法。
ContextLoader是一个工具类,用来初始化WebApplicationContext,其主要方法就是initWebApplicationContext,我们继续研究initWebApplicationContext这个方法:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
从上面的代码大家应该明白了Spring初始化之后,将ApplicationContext存到在了两个地方(servletContext中和currentContextPerThread中),那么是不是意味着我们可以通过两种方式取得ApplicationContext?
第一种获取方式:
- 1
- 2
那么咱们是不是可以这样获得ApplicationContext:
- 1
确实可以,而且我们想到这种方法的时候,Spring早就提供给我们接口了:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
getWebApplicationContext方法如下:
- 1
- 2
- 3
- 4
第二种方法:
前面说到Spring初始化的时候,将ApplicationContext还存了一份到ContextLoader的Map里面,那么我们是不是可以通过Map.get(key) ???很不幸的是,这个Map是私有的。
- 1
- 2
Spring为我们提供了方法:
- 1
- 2
- 3
- 4
第二种方法与第一种方法相比有什么好的地方呢?就是它不需要参数,只要在Web容器中,当Spring初始化之后,你不需要传入任何参数,就可以获得ApplicationContext。不过这个方法在Spring2.52版本中是不存在的,但是在2.5.5版本中提供了。
其实第二种获取方法看上去简单,但他的原理还是有一定难度的,他与类加载器的线程上下文相关,这个线程上下文在咱们常用的Mysql驱动中有用到。
第三种方式:
借用ApplicationContextAware,ApplicationContext的帮助类能够自动装载ApplicationContext,只要你将某个类实现这个接口,并将这个实现类在Spring配置文件中进行配置,Spring会自动帮你进行注入 ApplicationContext.ApplicationContextAware的代码结构如下:
- 1
- 2
- 3
- 4
- 5
- 6
就这一个接口。可以这样简单的实现一个ApplicationContextHelper类:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
通过ApplicationHelper我们就可以获得咱们想要的AppilcationContext类了。
spring boot里的做法
在spring boot里默认情况下不需要component-scan的配置,于是猜测在Spring boot里是不是只有一个WebApplicationContext?
后面测试下了,发现在spring boot里默认情况下的确是只有一个WebApplicationContext:org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
,所以在spring boot里省事了很多。
- WebApplicationContext初始化的三种方式
- WebApplicationContext初始化的三种方式
- Spring WebApplicationContext的两种初始化方式
- 启动webApplicationContext的方式
- java arrayList 初始化的三种方式
- C#初始化数组的三种方式
- 结构体的三种初始化方式
- C#初始化数组的三种方式
- Java数组的三种初始化方式
- Spring Bean 初始化的三种方式
- WebApplicationContext初始化
- WebApplicationContext初始化
- WebApplicationContext初始化
- WebApplicationContext初始化
- WebApplicationContext初始化
- WebApplicationContext初始化
- WebApplicationContext初始化
- WebApplicationContext初始化
- amoeba mysql读写分离测试
- python 自动发送邮件发送多人、群发、多附件
- 投票模块phpcms
- Windows 10 虚拟机很卡
- 畅联通工程续(最短路 算法模板。。。)
- WebApplicationContext初始化的三种方式
- Log4net相关知识
- 如何完全卸载Oracle 11g 豪华版
- jdk8 函数式接口
- android application回收
- 洛谷P1439 最长公共子序列(LCS问题)
- What's New in JDK 8
- 关于SweetAlertDialog在AS3.0环境下报错的处理.
- 推荐小微企业做宣传视频或产品视频时用酷播云,免费,无广告