Spring支持2中不同类型的数据定义模式,对SpringMVC中的组件进行声明,指定组件的行为方式
- 基于Traditional XML的配置定义模式
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
- 基于Schema-based XML的配置定义模式
<mvc:annotation-driven />
引入Schema-based XML是为了对Traditional的XML配置形式进行简化。通过Schema的定义,把一些原本需要通过几个bean的定义或者复杂的bean的组合定义的配置形式,用另外一种简单而可读的配置形式呈现出来。 Schema-based XML可以极大改善配置文件的可读性并且缩小配置文件的规模。而实际上,Schema-based XML的引入,是把原本静态的配置动态化、过程化。
Schema-based XML相比较Traditional XML至少有三个方面的优势:
- namespace —— 拥有很明确的逻辑分类
- element —— 拥有很明确的过程语义
- attributes —— 拥有很简明的配置选项
这段配置想要表达的意思,就是在mvc的空间内实现Annotation驱动的配置方式。其中,mvc表示配置的有效范围,annotation-driven则表达了一个动态的过程,实际的逻辑含义是:整个SpringMVC的实现是基于Annotation模式,请为我注册相关的行为模式。
一个Schema-based XML有两大构成要素:过程实现和配置定义。
1)所谓过程实现就是配置文件背后逻辑的实现过程,由2个接口完成:
NamespaceHandler —— 对Schema定义中namespace的逻辑处理接口
BeanDefinitionParser —— 对Schema定义中element的逻辑处理接口
NamespaceHandler是入口,它去调用BeanDefinitionParser的实现以实现各个逻辑。
如MvcNamespaceHandler中
public void init() {
registerBeanDefinitionParser("annotation-driven", new AnnotationDrivenBeanDefinitionParser());
registerBeanDefinitionParser("default-servlet-handler", new DefaultServletHandlerBeanDefinitionParser());
registerBeanDefinitionParser("interceptors", new InterceptorsBeanDefinitionParser());
registerBeanDefinitionParser("resources", new ResourcesBeanDefinitionParser());
registerBeanDefinitionParser("view-controller", new ViewControllerBeanDefinitionParser());
}
ResourcesBeanDefinitionParser就是的实现,这样我们不用写bean,可以通过编程(写ResourcesBeanDefinitionParser类)的方式对Bean进行注册,所以大大简化了XML配置。
2)所谓的配置定义,就是通过一些配置文件,将上述的过程实现类串联起来,从而完成整个Schema-based XML的定义,有2部分组成:
- Schema定义 —— 一个xsd文件,描述整个Schema空间中element和attribute的定义
- 注册配置文件 —— 由META-INF/spring.handlers和META-INF/spring.schemas构成,用以注册Schema和Handler
Schema定义(xsd文件)如 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd ,这个文件被同步发布于网上,但是你发现在无法上网的环境下还是能运行Spring,因为这个XSD文件在spring-webmvc下有备份
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
xsi:schemaLocation声明就是用于指定映射于本地的XSD文件,使Spring自动查找本地的缓存来进行schema的寻址。
在初始化的时候有一个log日志,org.springframework.beans.factory.support.DefaultListableBeanFactory@495c998a: defining beans,其下面就是组件注册的细节