【Spring】IOC核心源码学习(三):bean标签和自定义标签实现原理
基于schema的spring xml namespace扩展
基于Spring可扩展Schema提供自定义配置,扩展XML配置大致需要一下几个步骤:
1、创建一个需要扩展的组件
2、定义一个xsd文件描述组件内容
3、实现BeanDefinitionParser接口,用来解析xsd文件中的定义和组件定义
4、扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器
5、编写spring.handlers和spring.schemas文件
<!--EndFragment-->
基于Spring可扩展Schema提供自定义配置 扩展XML配置大致需要一下几个步骤, 并将产生的文件打成jar包, 在项目中引用该jar包: 1、创建一个需要扩展的组件 2、定义一个xsd文件描述组件内容 3、实现BeanDefinitionParser接口,用来解析xsd文件中的定义和组件定义 4、扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器 5、编写spring.handlers和spring.schemas文件
注意:spring.handlers和spring.schemas文件, 还有mytag.xsd文件都要放到resources文件夹下, 因为使用maven打包, 所在静态文件必须放在这个文件夹下, 就因为这个问题, 我浪费了一下午的时间, 总是提示找不到mytag.xsd文件
源码大概执行过程:
1、判断标签的命名空间, 是否是默认的命名空间http://www.springframework.org/schema/beans
2、不是默认的命名空间, 则使用自定义标签转换器转换
BeanDefinitionParserDelegate.parseCustomElement(ele)
3、
String namespaceUri = ele.getNamespaceURI(); 通过元素获取命名空间
//取得命名空间解析器DefaultNamespaceHandlerResolver, 找到解析命名空间为namespaceUri的解析器
//取得
NamesresolvepaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
if (handler == null) {
error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
return null;
}
return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
4、加载包下的META-INF/spring.handlers:DefaultNamespaceHandlerResolver.getHandlerMappings()
public static Properties loadAllProperties(String resourceName, ClassLoader classLoader) throws IOException {
Assert.notNull(resourceName, "Resource name must not be null");
ClassLoader clToUse = classLoader;
if (clToUse == null) {
clToUse = ClassUtils.getDefaultClassLoader();
}
Properties properties = new Properties();
Enumeration urls = clToUse.getResources(resourceName);
while (urls.hasMoreElements()) {
URL url = (URL) urls.nextElement();
InputStream is = null;
try {
URLConnection con = url.openConnection();
con.setUseCaches(false);
is = con.getInputStream();
properties.load(is);
}
finally {
if (is != null) {
is.close();
}
}
}
return properties;
}
5、从META-INF/spring.handlers中获取对应命名空间的处理类
http\://www.360buy.com/schema/ice=com.jd.common.ice.IceNamespaceHandler
6、加载处理类, 并实例化, 执行处理类的init方法,
NamespaceHandler namespaceHandler = (NamespaceHandler) BeanUtils.instantiateClass(handlerClass);
namespaceHandler.init();
handlerMappings.put(namespaceUri, namespaceHandler);
7、执行处理类的init方法, 将自定义标签解析器注册到NamespaceHandlerSupport.parsers(Map)的属性中
registerBeanDefinitionParser("config", new IceProxyBeanDefinitionParser());
8、执行NamespaceHandlerSupport.parse()方法, 从NamespaceHandlerSupport.parsers的属性中, 找到对应的解析器,执行parse()方法,最终返回BeanDefinition对象,
在parse()方法中, 重要的是:
def.setBeanClass(TagOne.class); 在这里指定生成Bean对象对应的Class
9、何时执行getObject()
相关推荐
在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过Chapter2工程的实例来学习。 Spring框架的自定义标签通常用于简化XML配置,提升可读性和可维护性。这些标签是基于Java的`org.spring...
总的来说,Spring自定义标签和注解解析原理的学习,不仅能够帮助开发者深入理解Spring的工作机制,还能提供自定义配置和扩展Spring功能的能力。通过这种方式,开发者可以根据项目需求创建出更符合业务逻辑的配置方式...
在Spring框架中,自定义标签解析是扩展Spring配置能力的重要方式。通过自定义标签,开发者可以创建更加符合业务逻辑和可读性强的XML配置文件。本文将深入剖析Spring 5.2.9版本中自定义标签的解析过程,旨在帮助读者...
在Spring框架中,自定义标签和注解解析是两个关键的特性,它们使得代码与配置的集成更加紧密,简化了应用程序的开发。本篇文章将深入探讨Spring如何处理这两种类型的元数据。 首先,让我们来理解Spring如何解析...
在Spring框架中,自定义标签的解析过程是一个关键的组件,它使得开发者能够通过XML配置文件以更加直观和简洁的方式声明Bean的定义。本节将深入探讨Spring 5.2.9版本中自定义标签的解析机制,以及背后的源码实现。 ...
当我们需要在Spring配置文件中引入自定义标签时,`NamespaceHandler`起着至关重要的作用。这篇博文通过分析`spring-web-namespacehandler`,将深入探讨这一主题。 首先,`NamespaceHandler`是Spring框架解析XML配置...
4. **使用自定义标签**:现在,你可以在Spring的XML配置文件中自由地使用自定义标签了,如`<dubbo:service interface="com.example.MyService" version="1.0.0" />`。 通过这种方式,我们可以创建出高度定制化的XML...
下面将详细介绍Spring MVC与Freemarker自定义标签的使用。 首先,我们需要了解Freemarker的基础。Freemarker是一个基于模板的语言,它的主要任务是根据数据模型生成输出。在Spring MVC中,Freemarker模板通常用于...
本篇文章将深入探讨Spring自定义标签的定义、解析以及相关源码分析。 首先,自定义标签的定义通常涉及到两个主要步骤: 1. **定义XSD文件**: XSD(XML Schema Definition)文件用于描述XML文档的结构和数据类型...
- 配置文件注册:在Spring的XML配置文件中,通过`<bean>`标签的`property-editorRegistrar`属性指定一个实现了`PropertyEditorRegistrar`接口的类。在该类的`registerEditors()`方法中,可以使用`...
基于Spring开发之自定义标签及其解析 Spring框架是现在Java最流行的开源框架之一,需要实现一些自定义的标签,主要是方便使用我们框架的人能够快速、简单进行配置。自定义标签的实现离不开XML Schema的定义,我们...
这个名为"Spring自定义配置文件便签[Maven]工程可运行"的项目,显然是一个基于Maven构建的Spring 5.0应用程序,它包含了自定义配置文件和标签的实现。让我们深入探讨一下这些概念及其在实际应用中的作用。 首先,...
标题:“spring自定义切面实例” 描述:本文档将深入探讨如何在Spring框架中实现自定义切面(Aspect),并提供具体的代码示例。通过利用Spring的AOP(面向切面编程)特性,特别是@AspectJ注解的支持,我们可以创建...
自定义标签可以与Spring MVC、Struts2等框架集成,提供更丰富的功能。 通过上述内容,我们了解了Freemarker自定义标签的基本概念、创建与使用方法,以及如何在实际项目中发挥作用。自定义标签极大地增强了...
这篇"Spring Security进阶篇 V 自定义标签控制显示"的博客文章显然深入探讨了如何在Spring Security中实现自定义的安全控制,以便更好地管理和展示应用内容。在本文中,我们将详细解析这个主题,并与"JSP自定义标签...
- Spring Web Flow、JSF等框架也提供了自定义标签的机制,进一步丰富了Web2.0开发中的自定义标签应用。 通过自定义标签,Web2.0应用可以更加灵活地构建用户界面,提供定制化的交互体验。同时,这也有助于提升...
实现spring自定义扩展标签的实现步骤
开发自定义标签时,一些工具和框架提供了便利,如Apache Struts的Tiles和Spring Web Flow。这些工具提供了更高级别的抽象,简化了自定义标签的创建和管理。 总结来说,自定义标签是Java Web开发中的重要技术,它...