当前位置: 首页 > 后端技术 > Java

聊聊自定义SPI如何使用自定义标签注入到spring容器中

时间:2023-04-02 00:34:39 Java

下面说说如何使用自定义标签将自定义SPI注入到spring容器中在容器中实现例程1.自定义xsd示例:</xsd:documentation>ps:如果不是xsd熟悉的朋友,可以参考以下链接https://www.w3school.com.cn/schema/index.asp2,自定义解析BeanDefinitionParser解析器示例:publicAnnotationBeanDefinitionParser(ClassbeanClass){this.beanClass=beanClass;}@OverridepublicBeanDefinitionparse(Elementelement,ParserContextparserContext){StringpackageToScan=element.getAttribute("basePackages");String[]packagesToScan=trimArrayElements(commaDelimitedListToStringArray(packageToScan));RootBeanDefinitionbeanDefinition=newRootBeanDefinition();beanDefinition.setBeanClass(beanClass);beanDefinition.setLazyInit(false);generateBeanName(元素,“id”,parserContext,beanClass.getName());parserContext.getRegistry().registerBeanDefinition(beanName,beanDefinition);返回bean定义;}}3.定义NamespaceHandler实现类来处理自定义标签处理器的例子:}}4.将processor和label的位置写入spring.handlers,spring。模式中的示例:spring.handlershttp\://lybgeek.github.com/schema/spi=com.github.lybgeek.spring.schema.SpiNamespaceHandlerspring.schemashttp\://lybgeek.github.com/schema/spi/spi.xsd=META-INF/spi/spi.xsd注意:spring.handlers、spring.schemas需要放在resource/META-INF下目录示例演示1.配置xml2.在启动类上导入xml@SpringBootApplication@ImportResource(locations="classpath:/spi.xml")publicclassSpiTestXmlApplication{publicstaticvoidmain(String[]args)throwsException{SpringApplication.run(SpiTestXmlApplication.class);}}3.验证spring是否注入了SPI容器@Overridepublicvoidrun(ApplicationArgumentsargs)抛出异常{applicationContext.getBeansOfType(SpringSqlDialect.class).forEach((beanName,bean)->System.out.println(beanName+"-->"+bean));}控制台输入如下springMysqlDialect-->com.github.lybgeek.dialect.mysql.SpringMysqlDialect@73041b7dmysql-hello-->com.github.lybgeek.dialect.mysql.SpringMysqlDialect@574059d5springOracleDialect-->com.github.lybgeek.dialect.oracle.SpringOracleDialect@4a50d04a表示已经导入到spring容器中。总结自从spring3+开始引入注解驱动,xml在新项目中很少用到,但是如果是一些老项目,想给spring注入自定义标签,可以使用本文的方式。套路如下 1.自定义xsd2,自定义解析BeanDefinitionParser解析器  3。定义NamespaceHandler实现类来处理自定义标签的处理器  4。写写处理器和标签的位置本文在spring.handlers和spring.schemas中的实现比较简单。如果想深入使用,推荐看dubbo自定义spring标签demo链接https://github.com/lyb-geek/springboot-learning/tree/master/springboot-spi-enhance/springboot-spi-框架弹簧