1 在spring中使用xml配置bean的时候 ,我们可能会使用到其他的命名空间。例如我们配置aop.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
<aop:config>
<aop:aspect id="myAspect" ref="aBean">
...
</aop:aspect>
</aop:config>
</beans>
那么这个aop前缀是怎么起作用的呢,这里的作用包含两部分一部分是校验格式,一部分是通过这些配置创建对应的java对象。
那么xsd这个文件在什么地方呢,有人可能会说指向 网上的一个链接,如果没有网呢,就不能校验了吗,事实上现代的一些集成环境是可以的 。这个文件其实在spring的jar包里面。在META-INFO/spring-schemals的文件中是会配置文件的真实的位置的。
这样就可以 在classpath下面找到对应的xsd文件。
解决了校验 的问题,还有一个就是怎么通过配置的标签创建对象的问题。 同样的在meta-info/spring-handlers文件中配置对应的类。
我们打开这个类
package org.springframework.aop.config;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
public class AopNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
// In 2.0 XSD as well as in 2.5+ XSDs
registerBeanDefinitionParser("config", new ConfigBeanDefinitionParser());
registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser());
registerBeanDefinitionDecorator("scoped-proxy", new ScopedProxyBeanDefinitionDecorator());
// Only in 2.0 XSD: moved to context namespace in 2.5+
registerBeanDefinitionParser("spring-configured", new SpringConfiguredBeanDefinitionParser());
}
}
可以发现对每一个命名空间下面支持的标签都设置了对应的BeanDefinition的解析器,这样这项标签就会被 创建成为BeanDefinition.spring就可以 使用BeanDefinition创建对象了