詳解SpringBoot如何刪除引用jar包中的無用bean
前言
公司有個項目,時間比較趕,而且項目的部分需求,和之前做的項目部分功能一樣,為了趕速度和直接將之前多模塊的maven項目中的部分模塊,直接以jar包的形式引入到新項目中了,雖然省去了不少開發(fā)時間,但是造成項目需要導(dǎo)入引入項目jar的相關(guān)依賴,導(dǎo)致項目臃腫,啟動很慢。有沒有辦法讓項目只加載自己需要的bean呢?
當(dāng)然我們可以直接修改源代碼重新打包引入去解決,但是這個辦法太多麻煩。
通過百度的手段,查詢可以在springboot啟動類上用@ComponentScan注解去實現(xiàn)
代碼示例
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = {"com.xx.controller","com.xx.xx"})})
但是經(jīng)過實現(xiàn)很多次發(fā)現(xiàn)沒用,原來項目包以外的bean一般是通過 通過spring SPI spring.factories的方法把Bean加載到另一個項目當(dāng)中去。
spring.factories會創(chuàng)建一些jar中的定義的bean,比如強制格式化返回值
后來發(fā)現(xiàn)通過使用BeanDefinitionRegistryPostProcessor,直接在 解析完bean的注冊信息后,直接移除就行,這樣就不會創(chuàng)建bean。
BeanDefinitionRegistryPostProcessor繼承BeanFactoryPostProcessor能夠管理這些bean
實現(xiàn)代碼示例
在項目中新建 RemoveRegistryBeanFactoryPostProcessor類,代碼如下
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.stereotype.Component; /** * @author liuya */ @Component public class RemoveRegistryBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor { @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { String[] names = registry.getBeanDefinitionNames(); for (String name : names) { if (name.contains("taskSendMessageListener") || name.contains("globalListener") || name.contains("executionSendMessageListener") || name.contains("processCallbackMesController")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.system.flow")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.system.modules.message")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.graphics.task")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.graphics.bimlight.location")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.graphics.bimlight.sectioning")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.graphics.modules")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.ubw.job")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.ubw.listener")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.ubw.msg")) { registry.removeBeanDefinition(name); } if (name.contains("org.springblade.ubw.service")) { registry.removeBeanDefinition(name); } } } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } }
當(dāng)然還有部分自動配置類的代碼需要刪除bean注冊,我們可以通過
@SpringBootApplication(exclude = {})的方式去實現(xiàn),代碼如下: @EnableAsync @EnableScheduling @SpringBootApplication(exclude = {DllInitLoader.class,ProcessEngineServicesAutoConfiguration.class}) public class UnifyWorkFaceApplication { public static void main (String[] args) { BladeApplication.run("work-face", UnifyWorkFaceApplication.class, args); } }
配置完畢,項目啟動速度快了很多,也去除了很多jar依賴,還刪除了很多無用表,比如flowable工作流的相關(guān)表,之前項目啟動時老是自動去查詢工作流的相關(guān)表,導(dǎo)致刪除數(shù)據(jù)庫的工作流的表項目就會啟動不起來,現(xiàn)在通過
@SpringBootApplication(exclude = {ProcessEngineServicesAutoConfiguration.class}) 移除ProcessEngineServicesAutoConfiguration自動配置類代碼,還有剔除,項目中引用flowable的項目類的注入,就可以正常啟動了。
以上就是詳解SpringBoot如何刪除引用jar包中的無用bean的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot刪除無用bean的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java分頁簡介_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java分頁簡介的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08深入分析java并發(fā)編程中volatile的實現(xiàn)原理
這篇文章主要介紹了深入分析java并發(fā)編程中Volatile的實現(xiàn)原理,涉及Volatile的官方定義,實現(xiàn)原理,使用優(yōu)化等相關(guān)內(nèi)容,具有一定參考價值,需要的朋友可以了解下。2017-11-11MyBatis中的SQL映射文件如何配置參數(shù)映射和使用方法
MyBatis 是一種開源的 Java 持久化框架,它可以自動將數(shù)據(jù)庫中的數(shù)據(jù)映射到 Java 對象中,并且使得 Java 對象可以非常方便地存儲到數(shù)據(jù)庫中,本文將介紹 MyBatis 中 SQL 映射文件的參數(shù)映射配置和使用方法,需要的朋友可以參考下2023-07-07Java Netty HTTP服務(wù)實現(xiàn)過程解析
這篇文章主要介紹了Java Netty HTTP服務(wù)實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08Java數(shù)據(jù)結(jié)構(gòu)之AC自動機算法的實現(xiàn)
AC自動機算法常被認(rèn)為是Trie樹+KMP算法的結(jié)合體,它是一個多模式匹配算法,在模式匹配領(lǐng)域被廣泛應(yīng)用。本文將詳細(xì)為大家介紹AC自動機的原理與實現(xiàn)方法,感興趣的可以了解一下2022-12-12