请先了解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配置类)