前言最近业务部给我们反馈了一个问题,本来我们部门提供的组件突然不能用了。究其原因是我们提供的组件类没有注入到spring容器中。之前没有问题,因为业务部的根包名和我们组件的根包名是一样的。后来改了他们的根包名,导致我们的组件类无法注入到spring中。当时的解决方案如下:@SpringBootApplication(scanBasePackages={"业务根包","组件根包"})就是在业务启动类中加入扫描组件根包。这种方法虽然可以解决,但是经过review,业务方需要知道组件的根包吗?有没有更优雅的方式?这篇文章会讲到如何将第三方服务注册到我们项目的spring容器中。注入方式1、注入的元件数量比较少。1.自动组装机制+@Bean形式示例:@Configuration@Slf4j@EnableConfigurationProperties(XxlJobProperty.class)publicclassXxlJobAutoConfiguration{@Bean@ConditionalOnMissingBeanpublicXxlJobSpringExecutorxxlJobExecutor(XxlJobPropertyproperty){log.info(">>>>>>>>>>>>xxl-job配置初始化。");XxlJobSpringExecutorxxlJobSpringExecutor=newXxlJob(SpringEx);xxlJobSpringExecutor.setAdminAddresses(property.getAdminAddresses());xxlJobSpringExecutor.setAppname(property.getExecutorAppname());.getExecutorPort());xxlJobSpringExecutor.setAccessToken(property.getAccessToken());xxlJobSpringExecutor.setLogPath(property.getExecutorLogPath());xxlJobSpringExecutor.setLogRetentionDays(property.getExecutorLogRetentionDays());返回xxlJobSpringExecutor;}在META-INF/spring.factories加入org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.github.lybgeek.autoconfiure.XxlJobAutoConfiguration2、利用@Eanblexxx+@Import机器制造示例:@Target(ElementType.TYPE)@Retention(retentionpolicy.runtime)@docudted@import(helloseviceimpl.class)public@interfaceenableHelloSvc{}在在在在加上加上加上加上加上加上加上加上加上加上加上加上加上加上加上加上加上加上加上加上启动加上加上加上调用调用调用beanfactory.reabirectory.regrestern()ConfigurableListableBeanFactorybeanFactory)throwsBeansException{StringbeanName=StringUtils.uncapitalize(HelloService.class.getSimpleName());log.info("注册bean:beanName:{}",beanName);beanFactory.registerSingleton(beanName,newHelloServiceImpl());}}2.注入的组件数量比较多1.自动组装机制+@ComponentScan例子:@Configuration@ComponentScan(basePackages=Constant.SVC_PACAKAEE)publicclassThirdPartySvcAutoConfiguration{}在META-INF/spring.factories中添加org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.github.lybgeek.autoconfiure.ThirdPartySvcAutoConfiguration2、@Eanblexxx+@Import机制+ClassPathScanningCandidateComponentProvider示例:publicclassThirdPartySvcRegisterimplementsImportBeanDefinitionRegistrar{@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){ClassPathBeanDefinitionScannerclassPathBeanDefinitionScanner=新的ClassPathBeanDefinitionScanner(注册表);classPathBeanDefinitionScanner.scan(Constant.SVC_PACAKAEE);}}@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(ThirdPartySvcRegister.class)public@interfaceEnableThirdPartySvcinbusinessprojectstart{}加上@EnableThirdPartySvc如果业务开发人员直接使用@SpringBootApplication(scanBasePackages={"业务根包","组件根包"})其实是没有问题的,但是如果作为组件提供给其他业务部门使用,就可以使业务部无意识和开箱即用会更优雅的方式demo链接https://github.com/lyb-geek/springboot-learning/tree/master/springboot-scan-thirdparty-service