如果要开发一个spring自定义的标签比如:
<pre:strategy id="strategyFrist" interface="org.test.spring.schema.strategy.FristStrategy" url="tcp://strategy/frist" />
扩展Spring自定义标签大致需要如下几步:
- 创建需要扩展的组件
- 定义XSD文件描述组件内容
- 创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义
- 创建Handler文件,扩展字NamespaceHandlerSupport,目的是将组件注册到Spring容器
- 编写Spring.handlers和Spring.schemas文件
具体步骤如下:
1、创建maven工程spring-schema,添加spring相应jar包
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> <optional>true</optional> </dependency>
2、创建一个bean,接收自定义标签属性,如StrategyBean,这里实现了FactoryBean接口,为了将自定义的标签解析完成后注入spring容器
public class StrategyBean implements FactoryBean<Object>{ private String id; private String url; private Class<?> interfaceName; @Override public Object getObject() throws Exception { return interfaceName.newInstance(); } @Override public Class<?> getObjectType() { return interfaceName; } @Override public boolean isSingleton() { return true; } //省略get/set方法 }
3、在工程的META-INF文件夹下定义一个XSD文件描述组件内容,如src/main/resources/META-INF/strategy.xsd
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.shijun.com/schema/strategy" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="strategy"> <xs:complexType> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="id" use="required"/> <xs:attribute type="xs:anySimpleType" name="interface" use="required"/> <xs:attribute type="xs:string" name="url" use="required"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> </xs:schema>
4、实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义,如StrategyBeanDefinitionParser
/** * 配置解析器 * @author shijun03 */ public class StrategyBeanDefinitionParser extends AbstractSingleBeanDefinitionParser{ @Override protected Class<?> getBeanClass(Element element) { return StrategyBean.class; } @Override protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { String id = element.getAttribute("id"); String url = element.getAttribute("url"); String interfaceName = element.getAttribute("interface"); if(StringUtils.hasText(id)){ //判断bean是否已经注册 boolean hasRegistry = parserContext.getRegistry().containsBeanDefinition(id); if(hasRegistry){ throw new IllegalArgumentException("bean has registry ,please check bean ,id = "+id); } builder.addPropertyValue("id", id); } if(StringUtils.hasText(url)){ builder.addPropertyValue("url", url); } if(StringUtils.hasText(interfaceName)){ Class<?> forName; try { forName = Class.forName(interfaceName); } catch (ClassNotFoundException e) { throw new IllegalArgumentException("interface class not found", e); } builder.addPropertyValue("interfaceName", forName); } } }
5、 创建Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器中,如StrategyBeanHandler
/** * 解析器注入 * @author shijun03 */ public class StrategyBeanHandler extends NamespaceHandlerSupport{ @Override public void init() { registerBeanDefinitionParser("strategy", new StrategyBeanDefinitionParser()); } }
6、编写Spring.handlers和Spring.schemas文件
路径:src/main/resources/META-INF/Spring.handlers
http\://www.shijun.com/schema/strategy=com.sjz.spring.schema.StrategyBeanHandler
路径:src/main/resources/META-INF/Spring.schemas
http\://www.shijun.com/schema/strategy.xsd=META-INF/strategy.xsd
7、创建测试配置文件
新建spring工程,引入前面创建的工程jar以及其他的jar
<dependency> <groupId>com.sjz</groupId> <artifactId>spring-schema</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> //…省略其他的jar
创建FristStrategy对象
public class FristStrategy { public String hello(){ return "hello schema"; } }
在src/main/resources下添加配置文件,如下spring-strategy.xml
<?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:pre="http://www.shijun.com/schema/strategy" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.shijun.com/schema/strategy http://www.shijun.com/schema/strategy.xsd"> <pre:strategy id="strategyFrist" interface="org.test.spring.schema.strategy.FristStrategy" url="tcp://strategy/frist" /> </beans>
通过Configuration注解引入spring-strategy.xml配置文件
@Configuration @ImportResource(locations="spring-strategy.xml") public class StrategyConfig { }
测试
@SpringBootApplication public class App { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(App.class, args); FristStrategy bean = context.getBean(FristStrategy.class); System.out.println("数据调用结果集========"+bean.hello()); } }
输出如下
数据调用结果集========hello schema
8、详细代码
spring自定义标签工程:https://github.com/ejshi/spring-schema.git 测试工程:https://github.com/ejshi/es/tree/master/test-spring-schema
相关推荐
在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过Chapter2工程的实例来学习。 Spring框架的自定义标签通常用于简化XML配置,提升可读性和可维护性。这些标签是基于Java的`org.spring...
本文将深入探讨Spring自定义标签的概念、实现过程及其在实际开发中的应用。 首先,理解Spring自定义标签的核心思想:通过扩展Spring的`BeanDefinitionParser`接口或使用`BeanDefinitionBuilder`类,我们可以创建...
总的来说,Spring自定义标签和注解解析原理的学习,不仅能够帮助开发者深入理解Spring的工作机制,还能提供自定义配置和扩展Spring功能的能力。通过这种方式,开发者可以根据项目需求创建出更符合业务逻辑的配置方式...
自定义精简版dubbo,运用spring自定义标签、netty、zookeeper、ImportBeanDefinition实现
在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自定义扩展标签的实现步骤