> 文章列表 > OpenAPI SDK组件之Spring拓展点的应用

OpenAPI SDK组件之Spring拓展点的应用

OpenAPI SDK组件之Spring拓展点的应用

简介

在二次封装时,为了使apisdk能够更好的让程序员们使用,于是和Spring进行了整合,开发者通过Spring管理OpenAPI的声明周期。

本篇主要涉及了Springboot自动装配、Spring自定义扫描、BeanDefinition、FactoryBean等的应用。

  • 自动装配是与Spring整合的入口
  • Spring自定义扫描开发者声明的OpenAPI
  • BeanDefinition修改OpenAPI声明
  • FactoryBean用于初始化OpenAPI实例,并注册到Spring容器中

自定义自动装配

注解

定义自动装配的注解,使用@Import指定装配的目标类

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import({AccessorScannerRegistrar.class, AccessorConfig.class})
public @interface OpenapiScan {// 扫描包路径String[] basePackages() default {};
}

AccessorScannerRegistrar 自动装配

public class AccessorScannerRegistrar implements ImportBeanDefinitionRegistrar {private static final String BASE_PACKAGES = "basePackages";@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {List<String> basePackages = new ArrayList<>();// 获取自定义注解的所有属性AnnotationAttributes attributes = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(OpenapiScan.class.getName()));for (String pkg : attributes.getStringArray(BASE_PACKAGES)) {if (StringUtils.hasText(pkg)) {basePackages.add(pkg);}}if (!basePackages.isEmpty()) {// 调用 Spring api 触发指定路径的扫描ClassPathAccessorScanner classPathAccessorScanner = new ClassPathAccessorScanner(registry);classPathAccessorScanner.registerFilters();classPathAccessorScanner.doScan(StringUtils.toStringArray(basePackages));}}
}

自定义路径扫描

ClassPathAccessorScanner实现了Spring的ClassPathBeanDefinitionScanner,借助Spring扫描所有的BeanDefinition,主要代码如下:

public class ClassPathAccessorScanner extends ClassPathBeanDefinitionScanner {@Overrideprotected Set<BeanDefinitionHolder> doScan(String... basePackages) {Set<BeanDefinitionHolder> beanDefinitionHolders = super.doScan(basePackages);GenericBeanDefinition definition;for (BeanDefinitionHolder beanDefinitionHolder : beanDefinitionHolders) {definition = (GenericBeanDefinition) beanDefinitionHolder.getBeanDefinition();// bean的名称String beanClassName = definition.getBeanClassName();// 设置 AccessorProxyBean,实现了 FactoryBeandefinition.setBeanClass(AccessorProxyBean.class);// 原始接口作为构造器的参数传入definition.getConstructorArgumentValues().addGenericArgumentValue(beanClassName);}return beanDefinitionHolders;}
}

FactoryBean

FactoryBean是Spring开放给开发者使用的Api,使用它可以把对象交给Spring容器管理,它也是很多开源框架与Spring整合的入口,也可以用它完成配置属性的注入。

apisdk应用

AccessorProxyBean是所有开放接口实例化的入口

property-placeholder应用

有时候开发者需要内置一些环境变量,并且在Bean初始化前完成。

其他开源框架

Mybatis也是通过FactoryBean和Spring整合。