如何把第三方服務(wù)注冊到spring項目容器中
前言
最近業(yè)務(wù)部門向我們反饋一個問題,我們部門原先提供的組件突然用不了了。后面排查是因為我們提供出去的組件類沒有注入到spring 容器中,之前沒問題是因為業(yè)務(wù)部門的根包名跟我們組件的根包名是一樣,后續(xù)他們根包名換了,導(dǎo)致我們的組件類沒法注入到spring中,當(dāng)時的解決方案是形如下
@SpringBootApplication(scanBasePackages = {"業(yè)務(wù)根包","組件根包"})
就是在業(yè)務(wù)的啟動類上加上掃描組件根包。
雖然這樣的方式可以解決,但是事后復(fù)盤了一下,業(yè)務(wù)方是否需要了解組件根包?是否還有更優(yōu)雅一點的方式?本文就來聊聊如何把第三方服務(wù)注冊到我們項目的spring容器中
注入方式
1、注入的組件個數(shù)比較少
自動裝配機制 + @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{ }
在業(yè)務(wù)項目啟動加上@EnableHelloSvc
調(diào)用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、注入的組件個數(shù)比較多
自動裝配機制 + @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 { }
在業(yè)務(wù)項目啟動加上@EnableThirdPartySvc
總結(jié)
如果是業(yè)務(wù)開發(fā)人員直接使用
@SpringBootApplication(scanBasePackages = {"業(yè)務(wù)根包","組件根包"})
其實是沒問題的,但是如果作為組件提供給其他業(yè)務(wù)部門使用,能讓業(yè)務(wù)部門無感知,開箱即用會是比較優(yōu)雅的方式
以上就是如何把第三方服務(wù)注冊到spring項目容器中的詳細內(nèi)容,更多關(guān)于spring注冊第三方服務(wù)注冊的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
云服務(wù)器環(huán)境搭建及部署(jdk、mysql、redis、nginx環(huán)境搭建)詳細步驟
這篇文章主要給大家介紹了關(guān)于云服務(wù)器環(huán)境搭建及部署(jdk、mysql、redis、nginx環(huán)境搭建)詳細步驟的相關(guān)資料,要在云服務(wù)器上搭建JDK、MySQL、Redis和Nginx的環(huán)境,可以按照以下步驟進行操作,需要的朋友可以參考下2024-01-01Java使用Alibaba Druid數(shù)據(jù)庫連接池的技術(shù)指南
Druid是阿里巴巴開源平臺上的一個項目,整個項目由數(shù)據(jù)庫連接池、插件框架和SQL解析器組成,它不僅支持高效的連接管理,還集成了 SQL 監(jiān)控、日志輸出和多種擴展功能,本文將從 Druid 的基本概念出發(fā),結(jié)合具體樣例,帶你全面掌握 Druid 的配置與使用,需要的朋友可以參考下2025-03-03Java中notify()和notifyAll()的使用區(qū)別
本文主要介紹了Java中notify()和notifyAll()的使用區(qū)別,文中通過示例代碼介紹的非常詳細,感興趣的小伙伴們可以參考一下2021-06-06