请先了解Spring的两个上下文
两个上下文的配置方法都一样,这里以DispatcherServlet为例
默认按名字找DispatcherServlet
配置文件
程序清单7.3:
ContextLoaderListener和DispatcherServlet
各自都会加载一个Spring应用上下文。
上下文参数contextConfigLocation
就是用来指定要被加载的XML文件的地址
这个文件定义了根应用上下文,它会被ContextLoaderListener
加载。
如程序清单7.3所示,根上下文读取的是第一个contextConfigLocation
,也就是“WEB-INF/spring/root-context.xml”中加bean定义。
DispatcherServlet
会根据Servlet的名字找到一个文件,并基于该文件加载应用上下文。
在程序清单7.3中,Servlet的名字是appServlet
,因此DispatcherServlet
会从“WEB-INF/appServlet-context.xml”文件中加载其应用上下文。
指定DispatcherServlet
配置文件
如果你希望DispatcherServlet
不通过名字自动读取配置文件,而是自己定配置文件的位置的话,那么可以在Servlet上指定一个contextConfigLocation
初始化参数
例如,如下的配中,DispatcherServlet
会从“WEB-INF/spring/appServlet/servlet-context.xml”加载它的bean:
使用基于Java的配置
要在Spring MVC中使用基于Java的配置,也就是让SpringMVC在启动的时候,从带有@Configuration注解的类上加载配置。
我们需要告诉Spring,我们打算使用Java来配置DispatcherServlet
,那么怎么告诉它呢?
通过XML配置,这个XML配置是用来告诉Spring:我要写一个Java类,这个类用来配置DispatcherServlet
自然,其他和DispatcherServlet
无关的配置当然就不写在Java中,这个”告诉“就是无关的
这里的XML是一种整体的配置,这里的Java配置是对DispatcherServlet的配置,我们要在整体配置中写一些东西让DispatcherServlet的配置方式变为Java配置
既然要用XML,那么XML写什么呢?使用参数:contextClass
,这个参数的作用是指定你要用的配置类型
(其实就是指定WebApplicationContext
的实现类,为什么WebApplicationContext接口的实现类能指定要用的配置类型)
我们将contextClass
这个参数的值设为AnnotationConfigWebApplicationContext
,就可以了
这个值这是一个WebApplicationContext
的实现类,由于他写在对DispatcherServlet的配置进行配置的contextClass
中,所以它会使告诉Spring的配置DispatcherServlet的方式为通过Java配置类来配置
总的来说,我们只要配置两个东西:
-
contextClass
参数的值是AnnotationConfigWebApplicationContext
,它说明了我们使用的是Java来配置DispatcherServlet
-
contextConfigLocation
指定了用于配置DispatcherServlet
的Java配置类
配置Java配置的XML例子
如下的程序清单展现了一个新的web.xml,在这个文件中,它所搭建的Spring MVC使用基于Java的Spring配置:
上面两个箭头是ContextLoaderListener
的上下文相关
下面两个箭头是DispatcherServelet
的上下文相关
上面第一个箭头和下面第一个箭头,指向的属性contexClass
使用AnnotationConfigWebApplicationContext
意味着两个上下文都使用JAVA的@Configuration
配置
上面第二个指向属性contextConfigLocation
意味着我们对ContextLoaderListener
具体使用的Java配置类是RootConfig
下面第二个箭头指向属性contextConfigLocation
意味着我们对DispatcherServelet
具体使用的Java配置类是WebConfigConfig
(RootConfig
和WebConfigConfig
都是自己写的Java配置类)