如何把第三方服务注册到spring项目容器中

 更新时间:2023年07月23日 09:14:18   作者:Linyb极客之路  
这篇文章主要为大家介绍了如何把第三方服务注册到spring项目容器中,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

最近业务部门向我们反馈一个问题,我们部门原先提供的组件突然用不了了。后面排查是因为我们提供出去的组件类没有注入到spring 容器中,之前没问题是因为业务部门的根包名跟我们组件的根包名是一样,后续他们根包名换了,导致我们的组件类没法注入到spring中,当时的解决方案是形如下

@SpringBootApplication(scanBasePackages = {"业务根包","组件根包"})

就是在业务的启动类上加上扫描组件根包。

虽然这样的方式可以解决,但是事后复盘了一下,业务方是否需要了解组件根包?是否还有更优雅一点的方式?本文就来聊聊如何把第三方服务注册到我们项目的spring容器中

注入方式

1、注入的组件个数比较少

自动装配机制 + @Bean的形式

示例:

@Configuration
@Slf4j
@EnableConfigurationProperties(XxlJobProperty.class)
public class XxlJobAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public XxlJobSpringExecutor xxlJobExecutor(XxlJobProperty property) {
        log.info(">>>>>>>>>>> xxl-job config init.");
        XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
        xxlJobSpringExecutor.setAdminAddresses(property.getAdminAddresses());
        xxlJobSpringExecutor.setAppname(property.getExecutorAppname());
        xxlJobSpringExecutor.setAddress(property.getExecutorAddress());
        xxlJobSpringExecutor.setIp(property.getExecutorIp());
        xxlJobSpringExecutor.setPort(property.getExecutorPort());
        xxlJobSpringExecutor.setAccessToken(property.getAccessToken());
        xxlJobSpringExecutor.setLogPath(property.getExecutorLogPath());
        xxlJobSpringExecutor.setLogRetentionDays(property.getExecutorLogRetentionDays());

        return xxlJobSpringExecutor;
    }

在META-INF/spring.factories加入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.github.lybgeek.autoconfiure.XxlJobAutoConfiguration

利用@Eanblexxx + @Import机制

示例:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(HelloSeviceImpl.class)
public @interface EnableHelloSvc{
}

在业务项目启动加上@EnableHelloSvc

调用beanFactory.registerSingleton()

示例:

@Slf4j
public class HelloSvcBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        String beanName = StringUtils.uncapitalize(HelloService.class.getSimpleName());
        log.info("register bean : beanName:{}",beanName);

        beanFactory.registerSingleton(beanName,new HelloServiceImpl());
    }
}

2、注入的组件个数比较多

自动装配机制 + @ComponentScan

示例:

@Configuration
@ComponentScan(basePackages = Constant.SVC_PACAKAEE)
public class ThirdPartySvcAutoConfiguration {
}

在META-INF/spring.factories加入

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.github.lybgeek.autoconfiure.ThirdPartySvcAutoConfiguration

@Eanblexxx + @Import机制+ClassPathScanningCandidateComponentProvider

示例:

public class ThirdPartySvcRegister implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        ClassPathBeanDefinitionScanner classPathBeanDefinitionScanner = new ClassPathBeanDefinitionScanner(registry);
        classPathBeanDefinitionScanner.scan(Constant.SVC_PACAKAEE);
    }
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ThirdPartySvcRegister.class)
public @interface EnableThirdPartySvc {
}

在业务项目启动加上@EnableThirdPartySvc

总结

如果是业务开发人员直接使用

@SpringBootApplication(scanBasePackages = {"业务根包","组件根包"})

其实是没问题的,但是如果作为组件提供给其他业务部门使用,能让业务部门无感知,开箱即用会是比较优雅的方式

demo链接

以上就是如何把第三方服务注册到spring项目容器中的详细内容,更多关于spring注册第三方服务注册的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot整合SQLite的超详细讲解

    SpringBoot整合SQLite的超详细讲解

    sqlite数据库是轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库,下面这篇文章主要给大家介绍了关于SpringBoot整合SQLite的超详细讲解,需要的朋友可以参考下
    2024-03-03
  • 云服务器环境搭建及部署(jdk、mysql、redis、nginx环境搭建)详细步骤

    云服务器环境搭建及部署(jdk、mysql、redis、nginx环境搭建)详细步骤

    这篇文章主要给大家介绍了关于云服务器环境搭建及部署(jdk、mysql、redis、nginx环境搭建)详细步骤的相关资料,要在云服务器上搭建JDK、MySQL、Redis和Nginx的环境,可以按照以下步骤进行操作,需要的朋友可以参考下
    2024-01-01
  • 用Java实现希尔排序的示例

    用Java实现希尔排序的示例

    问题:现有一段程序S,可以对任意n个数进行排序。如果现在需要对n^2个数进行排序,最少需要调用S多少次?只允许调用S,不可以做别的操作。我们用希尔排序来做解决这个
    2013-11-11
  • Micronaut框架的简单使用介绍

    Micronaut框架的简单使用介绍

    这篇文章主要介绍了Micronaut框架的简单使用介绍,帮助大家更好的理解和学习使用Micronaut,感兴趣的朋友可以了解下
    2021-04-04
  • Java使用Alibaba Druid数据库连接池的技术指南

    Java使用Alibaba Druid数据库连接池的技术指南

    Druid是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池、插件框架和SQL解析器组成,它不仅支持高效的连接管理,还集成了 SQL 监控、日志输出和多种扩展功能,本文将从 Druid 的基本概念出发,结合具体样例,带你全面掌握 Druid 的配置与使用,需要的朋友可以参考下
    2025-03-03
  • Java中的字节流文件读取教程(一)

    Java中的字节流文件读取教程(一)

    这篇文章主要给大家介绍了关于Java中字节流文件读取的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 浅析java中print和println的区别

    浅析java中print和println的区别

    以下是对java中print和println的区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-08-08
  • 类似微信说话功能的录音处理代码分享

    类似微信说话功能的录音处理代码分享

    这篇文章主要介绍了类似微信中说话功能的录音处理代码,需要大家自己加UI界面,大家参考使用吧
    2014-01-01
  • Java中notify()和notifyAll()的使用区别

    Java中notify()和notifyAll()的使用区别

    本文主要介绍了Java中notify()和notifyAll()的使用区别,文中通过示例代码介绍的非常详细,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Java List双击事件实现方法

    Java List双击事件实现方法

    这篇文章主要介绍了Java List双击事件实现方法,需要的朋友可以参考下
    2014-09-09

最新评论