详解SpringBoot如何删除引用jar包中的无用bean

2022-07-14,,,,

前言

公司有个项目,时间比较赶,而且项目的部分需求,和之前做的项目部分功能一样,为了赶速度和直接将之前多模块的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的详细内容,更多关于springboot删除无用bean的资料请关注其它相关文章!

《详解SpringBoot如何删除引用jar包中的无用bean.doc》

下载本文的Word格式文档,以方便收藏与打印。