别人写从0开始实现xxx,我就从-1开始,看起来更牛逼。今天先教大家实现一个中间件。创建一个新项目首先,我们创建一个多模块项目用于测试。该项目包含两个模块,test-infra用户中间件模块开发,以及用于测试的demo。4.0.0org.springframework.bootspring-boot-starter-parent2.7.0com.aixiaoxian.infraaixiaoxian-infra0.0.1-SNAPSHOT爱小仙-infra爱小仙-infrapom1.8demotest-inframaven-source-plugintruepackagejar-no-fork开发中间件项目创建OK,然后开始开发最简单最简单的中间件在resources目录下创建一个META-INFA/spring.factories文件用于自动装配,不要问我什么是自动装配,然后配置一个自动装配类。org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.aixiaoxian.testInfra.config.TestConfiguration实现TestConfiguration。最简单的方式就是直接使用@Bean注解声明一个Bean,交给Spring管理。@ConfigurationpublicclassTestConfigurationimplementsBeanDefinitionRegistryPostProcessor,EnvironmentAware{私人环境环境;@BeanpublicTestManagergetTestManager(){返回新的TestManager();}@OverridepublicvoidsetEnvironment(Environment.environment}enronmentimplementation=this中间件逻辑的处理部分是TestManager@Slf4jpublicclassTestManager{publicTestManager(){init();}publicvoidinit(){log.info("TestManagerstart");}}本例中,最简单的中间件开发完成,直接把它添加到demo模块中,开始测试。com.aixiaoxian.infratest-infra0.0.1-SNAPSHOT换个姿势让我们换个姿势来创建Bean,使用BeanDefinitionRegistryPostProcessor,让TestConfiguration实现,重写postProcessBeanDefinitionRegistry,注册一个新的BeanaiManager。@OverridepublicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistrybeanDefinitionRegistry)throwsBeansException{BeanDefinitionBuilderbeanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(AiManager.class);beanDefinitionBuilder.addConstructorArgValue(this.environment);beanDefinitionRegistry.registerBeanDefinition("aiManager",beanDefinitionBuilder.getBeanDefinition());}@Slf4jpublicclassAiManager{privateEnvironment环境;publicAiManager(Environment环境){this.environment=environment;在里面();}publicvoidinit(){log.info("AiManager启动");对Bean有了基本的了解,如果想声明一个注解给别人使用怎么办?首先创建一个注解,注意我用的是@Import注解,TestImportSelector实现了TestImportSelector接口。@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Import({TestImportSelector.class})@Documentedpublic@interfaceTestAnnotation{}publicclassTestImportSelectorimplementsDeferredImportSelector{@OverridepublicString[]selectImports(AnnotationMetadata){返回新字符串[]{AnnotationConfiguration.class.getName()};}}AnnotationConfiguration的写法也很简单,同样实现了自动组装。当然,如果用上面的写法,也可以达到同样的效果,不过还是建议这样写,别问,问就好。公共类AnnotationConfiguration实现BeanDefinitionRegistryPostProcessor{@OverridepublicvoidpostProcessBeanDefinitionRegistry(BeanDefinitionRegistrybeanDefinitionRegistry)throwsBeansException{BeanDefinitionBuilderbeanDefinitionBuilder=BeanDefinitionBuilder.genericBeanDefinition(AnnotationManager.class);beanDefinitionRegistry.registerBeanDefinition("annotationManager",beanDefinitionBuilder.getBeanDefinition());}@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactoryconfigurableListableBeanFactory)throwsBeansException{}}@Slf4jpublicclassAnnotationManager{publicAnnotationManager(){init();}publicvoidinit(){log.info("AnnotationManager开始");}}最后在演示启动类上打上我们这个注解。@SpringBootApplication@TestAnnotationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}最后我们可以看到输出:2022-06-2119:05:07.433INFO4598---[main]c.a.testInfra.manager.TestManager:TestManagerstart2022-06-2119:05:07.456INFO4598---[main]c.a.testInfra.manager.AiManager:AiManagerstart2022-06-2119:05:07.456INFO4598---[main]c.a.testInfra.manager.AnnotationManager:AnnotationManagerstartOK,就是这样,我猜,没有人需要这个源代码对吧?后面的文章,先写到这里铺垫一下,收尾。