首頁 >Java >java教程 >SpringBoot怎麼刪除引用jar包中的無用bean

SpringBoot怎麼刪除引用jar包中的無用bean

王林
王林轉載
2023-05-14 20:07:092187瀏覽

前言

公司有個項目,時間比較趕,而且專案的部分需求,和之前做的專案部分功能一樣,為了趕速度和直接將之前多模組的maven專案中的部分模組,直接以jar包的形式引入到新項目中了,雖然省去了不少開發時間,但是造成項目需要導入引入項目jar的相關依賴,導致項目臃腫,啟動很慢。有沒有辦法讓專案只載入自己需要的bean呢?

當然我們可以直接修改原始碼重新打包引入去解決,但是這個辦法太多麻煩。

透過百度的手段,查詢可以在springboot啟動類別上用@ComponentScan註解去實現

程式碼範例

@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.REGEX,
        pattern = {"com.xx.controller","com.xx.xx"})})

但是經過實作很多次發現沒用,原來項目套件以外的bean一般是透過spring SPI spring.factories的方法把Bean載入到另一個專案當中去。

spring.factories會建立一些jar中的定義的bean,例如強制格式化回傳值

後來發現透過使用BeanDefinitionRegistryPostProcessor,直接在解析完bean的註冊資訊後,直接移除就行,這樣就不會創建bean。

BeanDefinitionRegistryPostProcessor繼承BeanFactoryPostProcessor能夠管理這些bean

實作程式碼範例

在專案中新建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 {
    }
}

當然還有部分自動設定類別的程式碼需要刪除bean註冊,我們可以透過

@SpringBootApplication(exclude = {})的方式去实现,代码如下:
@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工作流程的相關表,先前專案啟動時老是自動去查詢工作流程的相關表,導致刪除資料庫的工作流程的表格專案就會啟動不起來,現在透過

@SpringBootApplication(exclude = {ProcessEngineServicesAutoConfiguration.class}) 移除ProcessEngineServicesAutoConfiguration自動配置類別代碼,還有剔除,專案中引用flowable的專案類別的注入,就可以正常啟動了。

以上是SpringBoot怎麼刪除引用jar包中的無用bean的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除