前言上一篇主要讲了如何实现一个带有拦截器功能的SPI。今天就来说说自定义SPI是如何与spring结合的。思考:在我们实现的SPI中应该和spring集成哪些东西?或者我们应该利用spring的哪些特性来实现我们的东西呢?除了众所周知的IOC和AOP,spring还提供了丰富的扩展点,比如各种后处理器。今天我们就来说说一个大家比较熟悉的话题,自定义注解的使用方法。注入spring容器,整合思路1.自定义注解@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public@interfaceActivate{Stringvalue()default"";}2.自定义bean定义scannerpublicclassActivateClassPathBeanDefinitionScanner扩展ClassPathBeanDefinitionScanner{publicActivateClassPathBeanDefinitionScanner(BeanDefinitionRegistryregistry){super(registry);}@SneakyThrows@OverrideprotectedvoidregisterBeanDefinition(BeanDefinitionHolderdefinitionHolder,BeanDefinitionRegistryregistry){super.registerBeanDefinition(definitionHolder,registry);Classclz=Class.forName(definitionHolder.getBeanDefinition().getBeanClassName());激活activate=AnnotationUtils.findAnnotation(clz,Activate.class);如果(ObjectUtils.isNotEmpty(激活)&&StringUtils.isNotBlank(activate.value())){StringactivateName=getEnvironment().resolvePlaceholders(activate.value());registry.registerBeanDefinition(activateName,definitionHolder.getBeanDefinition());}}@OverrideprotectedbooleanisCandidateComponent(AnnotatedBeanDefinitionbeanDefinition){returnsuper.isCandidateComponent(beanDefinition)&&beanDefinition.getMetadata().hasAnnotation(Activate.class.getName());}3、定义ImportBeanDefinitionRegistrarpublicclassSpiRegisterimplementsImportBeanDefinitionRegistrar,EnvironmentAware{privateEnvironment环境;@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){Set
